我有一个user_id作为主键的user表和一个user_dates表,其中user_date_id作为主键,user_id链接到user表和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
答案 0 :(得分:0)
我认为子查询不适用于Zend_Db_Select,尽管我不是100%肯定。 docs表示该参数必须是:
array|string|Zend_Db_Expr $name
您可以尝试为子查询创建Zend_Db_Expr。
答案 1 :(得分:0)
您的子查询可以是另一个Zend_Db_Select对象,或者如果遇到问题,可以使用Zend_Db_Expr来包装字符串版本。
他们通常按预期工作,没有任何特殊工作。