我有一个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
建议:使用$ oSelect - > __ toString()精确查看查询的内容。 – 2011-06-04 19:36:01
你确定你的查询的SQL有效性吗?你尝试过使用HAVING吗?为什么你在不使用主查询的情况下加入日期? – regilero 2011-06-05 12:02:56