【问题标题】:how to change the order of columns in a query with joins using Zend_Db_Select如何使用 Zend_Db_Select 更改查询中列的顺序
【发布时间】:2026-01-25 02:40:01
【问题描述】:

我有相当复杂的查询,我可以使用 Zend_Db_Select 逐步构建它。查询如下所示:

SELECT `subscribers`.`subscriber_id`, `subscribers`.`email_address`, `subscribers`.`first_name`,
`subscribers`.`last_name`, `t1`.`value` AS `'SingleLineField'`, `t2`.`value` AS `'MultilineField'`,
`t3`.`value` AS `'CheckboxField'`
FROM `subscribers`
INNER JOIN (SELECT subscriber_id
            FROM subscribers
            WHERE list_id =68 AND state=1
            LIMIT 0, 25) AS `s` ON subscribers.subscriber_id = s.subscriber_id
LEFT JOIN `subscribers_custom_data_string` AS `t1` ON subscribers.subscriber_id=t1.subscriber_id AND t1.field_id=177
LEFT JOIN `subscribers_custom_data_string` AS `t2` ON subscribers.subscriber_id=t2.subscriber_id AND t2.field_id=178
LEFT JOIN (SELECT subscribers_multivalued.subscriber_id, field_id, GROUP_CONCAT(value SEPARATOR ',') AS value
           FROM subscribers_multivalued
           INNER JOIN (SELECT subscriber_id
                       FROM subscribers
                       WHERE list_id =68 AND state=1
                       LIMIT 0, 25) AS s1 ON subscribers_multivalued.subscriber_id=s1.subscriber_id
           WHERE field_id=179
           GROUP BY subscribers_multivalued.subscriber_id, field_id) AS `t3` ON subscribers.subscriber_id=t3.subscriber_id AND t3.field_id=179

但现在我需要能够动态更改列的顺序,以便能够将上述查询转换为:

SELECT  `subscribers`.`subscriber_id`, `subscribers`.`email_address` , `t1`.`value` AS `'SingleLineField'`, `t2`.`value` AS `'MultilineField'`,
`t3`.`value` AS `'CheckboxField'`, `subscribers`.`first_name`,
`subscribers`.`last_name`
FROM `subscribers`
INNER JOIN (SELECT subscriber_id
            FROM subscribers
            WHERE list_id =68 AND state=1
            LIMIT 0, 25) AS `s` ON subscribers.subscriber_id = s.subscriber_id
LEFT JOIN `subscribers_custom_data_string` AS `t1` ON subscribers.subscriber_id=t1.subscriber_id AND t1.field_id=177
LEFT JOIN `subscribers_custom_data_string` AS `t2` ON subscribers.subscriber_id=t2.subscriber_id AND t2.field_id=178
LEFT JOIN (SELECT subscribers_multivalued.subscriber_id, field_id, GROUP_CONCAT(value SEPARATOR ',') AS value
           FROM subscribers_multivalued
           INNER JOIN (SELECT subscriber_id
                       FROM subscribers
                       WHERE list_id =68 AND state=1
                       LIMIT 0, 25) AS s1 ON subscribers_multivalued.subscriber_id=s1.subscriber_id
           WHERE field_id=179
           GROUP BY subscribers_multivalued.subscriber_id, field_id) AS `t3` ON subscribers.subscriber_id=t3.subscriber_id AND t3.field_id=179                         

或者例如,类似这样的:

SELECT  `subscribers`.`subscriber_id`, `t1`.`value` AS `'SingleLineField'`, `t2`.`value` AS `'MultilineField'`,
`t3`.`value` AS `'CheckboxField'`, `subscribers`.`email_address`, `subscribers`.`first_name`,
`subscribers`.`last_name`
FROM `subscribers`
INNER JOIN (SELECT subscriber_id
            FROM subscribers
            WHERE list_id =68 AND state=1
            LIMIT 0, 25) AS `s` ON subscribers.subscriber_id = s.subscriber_id
LEFT JOIN `subscribers_custom_data_string` AS `t1` ON subscribers.subscriber_id=t1.subscriber_id AND t1.field_id=177
LEFT JOIN `subscribers_custom_data_string` AS `t2` ON subscribers.subscriber_id=t2.subscriber_id AND t2.field_id=178
LEFT JOIN (SELECT subscribers_multivalued.subscriber_id, field_id, GROUP_CONCAT(value SEPARATOR ',') AS value
           FROM subscribers_multivalued
           INNER JOIN (SELECT subscriber_id
                       FROM subscribers
                       WHERE list_id =68 AND state=1
                       LIMIT 0, 25) AS s1 ON subscribers_multivalued.subscriber_id=s1.subscriber_id
           WHERE field_id=179
           GROUP BY subscribers_multivalued.subscriber_id, field_id) AS `t3` ON subscribers.subscriber_id=t3.subscriber_id AND t3.field_id=179                 

问题是我不能多次使用 Zend_Db_Select 的方法(在这种情况下它会生成新的连接,这不是我想要的)来更改查询中电子邮件、名字和姓氏字段的顺序。你有什么想法可以解决这个问题吗?

【问题讨论】:

  • 我需要 Zend_Db_Select 因为我需要分页器。
  • 我现在看不到用间歇性列(来自主表和连接表)制作 Zend_Db_Select 的方法,例如查询 2 或 3。
  • 我仍然找不到这个问题的答案。

标签: php zend-framework zend-db-select


【解决方案1】:

您可以使用->columns() 方法来选择您想要的列。 我们在 from 方法中使用空数组,然后使用 columns() 调用,即使里面有一个很大的 Zend_Db_Expr,你可以决定以你想要的方式和顺序编写你的选择参数。

【讨论】:

  • 非常感谢,它看起来会起作用,而且我似乎可以多次使用列。