【发布时间】:2011-06-04 19:11:07
【问题描述】:
我有一个以 user_id 作为主键的用户表和一个以 user_date_id 作为主键的 user_dates 表,user_id 链接到用户表以及 start_date 和 end_date 字段。
我正在尝试运行查询以获取用户列表并按最早日期对他们进行排序,但仅使用尚未过去的日期。因此,我试图运行一个子查询来获取这个日期,然后用它来订购用户。
到目前为止,我有以下链接表,但我不确定如何在 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;'))
我无法回显 $oSelect,因为我在这台机器上没有 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 () 来准确查看查询的样子。
-
您确定查询的 SQL 有效性吗?您是否尝试过使用 HAVING?为什么不使用它就在主查询中加入日期?
标签: sql zend-framework subquery