【问题标题】:php mySQL group concat and group byphp mySQL 组 concat 和 group by
【发布时间】:2015-10-19 08:45:20
【问题描述】:

我有两张桌子

table 1: 
 row  | car_id | car_model | 
  1      1          CAR 1      
  2      2          CAR 2      
  3      3          CAR 3  
  4      4          CAR 4

table 2:

 row  | car_id |  car_features |
  1      1          Features 1
  2      2          Features 2
  3      2          Features 3

我要显示的内容:

 row  | car_id | car_model | car_features |
  1      1          CAR 1      Features 1
  2      2          CAR 2      Features 2,Features 3
  3      3          CAR 3      
  4      4          CAR 4      

如果我使用 group concat 和 group by

将显示第 1,2 行,我想显示所有行...

     row  | car_id | car_model | car_features |
      1      1          CAR 1      Features 1
      2      2          CAR 2      Features 2,Features 3

请把sql语句发给我..谢谢!!

这是我的查询

$format = mysql_query("SELECT c.* , p.*, d.*,f.* ,GROUP_CONCAT(DISTINCT e.features_title SEPARATOR '<br>') AS 'car_features' FROM bsi_car_master c,bsi_car_type p, bsi_car_vendor d, bsi_selected_features f, bsi_car_features e WHERE c.car_type_id=p.id AND c.car_vendor_id=d.id AND c.car_id = f.car_id AND f.features_id = e.id GROUP BY c.car_id");

【问题讨论】:

标签: php mysql sql


【解决方案1】:

您应该按照 cmets 中的建议使用左连接:

SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.car_id=table2.car_id;

看看一些 MySQL 教程。 w3schools.org 帮助了我很多。

我想这应该对你有用。

但如前所述,请在您的问题上多加努力。我很乐意提供帮助,StackOverflow 不是免费的代码服务!

【讨论】:

  • 如果这有助于您解决问题,请考虑将我的答案标记为您问题的正确答案。这对我们所有人都有帮助。帮忙没问题!希望它能解决你的问题。
【解决方案2】:

使用外连接,即使table2中不存在匹配记录也能获取行。

更新:现在您已经显示了您的查询:

看到您的查询很奇怪,因为一方面您似乎是初学者,另一方面您使用的是上个世纪教授的连接语法,并且早已过时。

所以你的查询应该看起来像这样更好:

SELECT 
  c.*, 
  p.*, 
  d.*,
  f.*,
  GROUP_CONCAT(DISTINCT e.features_title SEPARATOR '<br>') AS car_features 
FROM bsi_car_master c
INNER JOIN bsi_car_type p ON p.id = c.car_type_id
INNER JOIN bsi_car_vendor d ON d.id = c.car_vendor_id
LEFT JOIN bsi_selected_features f ON f.car_id = c.car_id
LEFT JOIN bsi_car_features e ON e.id = f.features_id
GROUP BY c.car_id

p 和 d 是内连接的,即 p 和 d 必须匹配,否则不会选择 c 记录。但是 f 是外连接的,因此即使 f 中不存在该 c 的记录(然后该记录中的所有 f 列都为空),您也会得到 c(以及 p 和 d)。至于选择 e,我们也必须外连接它,因为同样,如果我们没有匹配到,我们仍然想要记录 c 与 p 和 d。

顺便说一句,我把'car_features' 改成了car_features。单引号用于字符串文字。双引号用于名称,但这里不需要它们

【讨论】:

  • 投反对票?有人认为这个答案不正确吗? OP 显然有一个查询,所以他们只需要更改连接类型。我不能说是左加入还是右加入,因为 OP 忘记发布他们的查询。
  • 我认为简洁不会使答案仅仅成为评论。问题是,如何在没有匹配的情况下查看记录。答案是外连接表。然而,现在我们看到了实际的查询,我们看到连接语法已经过时,并且有 两个 表必须进行外连接。我已经相应地更新了我的答案。
  • 赞成费心编写整个查询并指出手册 joins 的不一致之处。虽然我们提供可以在其他地方轻松获得的免费辅导,但我要指出,“名称”正式称为标识符。标识符可以由 ANSI 标准“双引号”或 MySQL(和其他一些方言)特定的`反引号`分隔。
  • @ThorstenKettner 非常感谢...但是带有空 car_features 的 car_id 是空白的...
  • c.car_id 应该有一个值,f.car.id 应该为空。我不知道 MySQL 如何处理c.*f.*。它显示两个 car_id 列还是只显示一个?如果它只显示一个,那么它似乎决定选择错误的一个。只需明确命名您想要查看的列,而不是使用*;这应该可以解决问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 2019-02-11
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2020-06-04
相关资源
最近更新 更多