SELECT查询分组/合并非DISTINCT结果集

时间:2016-05-17 11:29:05

标签: php mysql

----------   ----------   ----------   ----------    
| t1     |   | t2     |   | t3     |   | t4     |  
----------   ----------   ----------   ----------  
| id     |   | id     |   | id     |   | t1_id  |  
| foo    |   | bar    |   | foobar |   | t2_id  |  
----------   ----------   ----------   | t3_id  |  
                                       ----------  

我有这组表,并且有这个特定的查询:

  

SELECT foo,bar,foobar FROM t4
  LEFT JOIN t1 ON t1.id = t4.t1_id
  LEFT JOIN t2 ON t2.id = t4.t2_id
  LEFT JOIN t3 ON t3.id = t4.t3_id;

然后我可以想出这个特定的结果集:

------------------------------       -------------------------------        
| foo    | bar     | foobar  |  =>   | foo      | bar     | foobar |  
------------------------------       -------------------------------  
| x      | y       | a       |       | x        | y       | a      |  
| x      | y       | b       |       |          |         | b      |  
| x      | y       | c       |       |          |         | c      |
------------------------------       -------------------------------  

问题是:如何将查询格式化为以某种方式将具有相似条目的列分组,而不是那些不具有相似条目的列?这在MySQL中是否可行?我是通过PHP输出的,所以我应该让PHP处理它的格式吗?

同样的问题是否应由 PHP处理。

2 个答案:

答案 0 :(得分:1)

你应该让PHP处理格式化。通常,SQL结果集(和表)表示无序集。您的格式有一个特定的顺序。

将值放在一行可能会有所帮助,第三列作为“列表”:

SELECT foo, bar, GROUP_CONCAT(foobar) as foobars
FROM t4 LEFT JOIN
     t1
     ON t1.id = t4.t1_id LEFT JOIN
     t2 
     ON t2.id = t4.t2_id LEFT JOIN
     t3
     ON t3.id = t4.t3_id
GROUP BY foo, bar;

也就是说, 可以在MySQL中做你想做的事情(例如使用变量),但PHP是更好的格式化地方。

答案 1 :(得分:0)

SELECT distinct foo, bar, foobar FROM t4
LEFT JOIN t1 ON t1.id = t4.t1_id
LEFT JOIN t2 ON t2.id = t4.t2_id
LEFT JOIN t3 ON t3.id = t4.t3_id;