2011-06-04 82 views
3

我有一个user_id作为主键的user表和user_date_id作为主键的user_dates表,user_id链接到用户表以及start_date和end_date字段。ZF子查询问题

我想运行一个查询来获取用户列表,并按照最早的日期排序,但只使用尚未通过的日期。因此,我试图运行子查询来获取此日期,然后使用它来订购用户。

到目前为止,我有以下链接表,但我不知道如何在ZF中添加子查询?

$oSelect = $this->getDbConnection() 
    ->select() 
    ->from(array('u' => 'users'), '*') 
    ->joinInner(array('d' => 'user_dates') 
    , 'u.user_id = d.user_id', array('start_date', 'end_date')) 

子查询将是这样的:

SELECT start_date FROM user_dates d 
WHERE d.user_id=u.user_id && start_date > NOW() 
ORDER BY start_date ASC LIMIT 0,1 

感谢

所以,我可以做到以下几点:

$oSelect = $this->getDbConnection() 
->select() 
->from(array('u' => 'users'), '*') 
->joinInner(array('d' => 'user_dates') 
, 'u.user_id = d.user_id', array('start_date' => 
          new Zend_Db_Expr('SELECT start_date FROM user_dates d WHERE d.user_id=u.user_id && start_date > NOW() ORDER BY start_date ASC LIMIT 0,1'), 'end_date;')) 

我不能回声$ O选择因为我没有在这台机器上使用ZF,但我希望能够实现的查询如下:

SELECT u . * , (

SELECT start_date 
FROM dates d 
WHERE d.user_id = u.user_id && end_date > NOW() 
ORDER BY start_date ASC 
LIMIT 0 , 1 
) AS date 
FROM `users` u 
INNER JOIN dates d ON u.user_id = d.user_id 
WHERE end_date > NOW() 
GROUP BY u.user_id 
ORDER BY date ASC 
LIMIT 0 , 30 

你是对的,忽略了上述情况,查询应该是:

SELECT u. * , (

SELECT start_date 
FROM dates d 
WHERE d.user_id = u.user_id && end_date > NOW() 
ORDER BY start_date ASC 
LIMIT 0 , 1 
) AS date 
FROM `users` u 
GROUP BY u.user_id 
HAVING date 
ORDER BY date ASC 
LIMIT 0 , 30 
+1

建议:使用$ oSelect - > __ toString()精确查看查询的内容。 – 2011-06-04 19:36:01

+0

你确定你的查询的SQL有效性吗?你尝试过使用HAVING吗?为什么你在不使用主查询的情况下加入日期? – regilero 2011-06-05 12:02:56

回答

0

我不认为子查询与Zend_Db_Select对象的工作,虽然我不是100%肯定。该docs说帕拉姆必须是:

array|string|Zend_Db_Expr $name 

您可以尝试创建一个Zend_Db_Expr为您的子查询。

0

您的子查询可以是另一个Zend_Db_Select对象,或者如果您有问题,可以使用Zend_Db_Expr包装字符串版本。

他们通常按预期工作,没有任何特别的工作。

+0

请看我现在编辑的原始文章,这看起来不错吗?不幸的是我现在无法测试它。 – 2011-06-04 21:39:13

+0

我尝试加入子查询,而不是将它们粘在表达式上......现在,请执行Elzo说的和echo $ oSelect;查看正在生成的内容...... – 2011-06-04 21:51:51