【问题标题】:ZF Sub Query QuestionZF 子查询问题
【发布时间】: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


【解决方案1】:

我不认为子查询与 Zend_Db_Select 一起工作,尽管我不是 100% 确定。 docs 说参数必须是:

array|string|Zend_Db_Expr $name

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

【讨论】:

    【解决方案2】:

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

    它们通常按预期工作,无需任何特殊工作。

    【讨论】:

    • 请看我现在编辑的原始帖子,这看起来对吗?很遗憾,我现在无法测试它。
    • 我尝试加入子查询而不是将它们作为表达式粘贴...现在,按照 Elzo 所说的做并回显 $oSelect;看看正在生成什么......
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2015-06-26
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多