ZF子查询问题

时间:2011-06-04 19:11:07

标签: sql zend-framework subquery

我有一个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

2 个答案:

答案 0 :(得分:0)

我认为子查询不适用于Zend_Db_Select,尽管我不是100%肯定。 docs表示该参数必须是:

array|string|Zend_Db_Expr $name

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

答案 1 :(得分:0)

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

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