php mySQL group concat和group by

php mySQL group concat和group by,php,mysql,sql,Php,Mysql,Sql,我有两张桌子 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

我有两张桌子

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");
$format=mysql\u query(“从bsi\u car\u master c、bsi\u car\u type p、bsi\u car\u vendor d、bsi\u selected\u features f、bsi\u car\u features e e中选择c.*、p.*、d.*、f.*、组作为“car\u features”,其中c.car\u type\u id=p.id和c.car\u vendor\u id=f.car\u id=c.id和f.car\u features\u id=c.);

使用外部联接,以便即使在表2中不存在匹配记录时也能获取行

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

看到您的查询是非常奇怪的,因为一方面您似乎是一个初学者,另一方面您使用的是上个世纪教过的连接语法,而且已经过时很久了

因此,您的查询最好如下所示:

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
选择
c、 *,
p、 *,
d、 *,
f、 *,
将组(不同的e.features(标题分隔符“
”)作为汽车特征 来自bsi_车_主c p.id上的内部连接bsi\U car\U type p=c.car\U type\U id d.id=c.car\U供应商id上的内部连接bsi\U car\U供应商d 左连接bsi\U选定功能f ON f.car\u id=c.car\u id e.id=f.features\U id上的左连接bsi\U car\U功能e 按c.car\u id分组
p和d是内部连接的,即p和d中必须有匹配项,否则不会选择c记录。但f是外部连接的,所以即使f中不存在该c的记录(那么该记录中的所有f列都为null),也会得到c(以及p和d)。至于选择e,我们也必须外接,因为同样,如果我们没有匹配,我们仍然需要记录c和p和d


顺便说一句,我把
'car\u features'
改为
car\u features
。单引号用于字符串文本。双引号用于名称,但此处不需要双引号

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

SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.car_id=table2.car_id;
看看一些MySQL教程。w3schools.org帮助了我很多

我想这应该对你有好处


但正如我所说的,请在你的问题上再努力一点。我很乐意帮忙,StackOverflow不是免费的代码服务

可能是左连接。能给我举个例子吗?:)就像普通连接一样,但是指定左连接。我觉得这里缺少一个关键元素?我们不是一个免费的编码服务…你为什么不在前面的问题中问这个问题?否决票?有人认为这个答案不正确吗?OP显然有一个查询,因此他们只需更改联接类型。我不能说是左连接还是右连接,因为OP忘记发布他们的查询。我认为简洁并不能让答案仅仅是一个评论。问题是,如何在没有匹配的情况下查看记录。答案是加入表。然而,现在我们看到了实际的查询,我们看到连接语法已经过时,并且有两个表必须进行外部连接。我已经相应地更新了我的答案。我投票赞成费心编写整个查询并指出手册
join
s中的不一致之处。虽然我们提供免费的教程,可以在其他地方轻松获得,但我要指出,“名称”正式称为标识符。标识符可以用ANSI标准的“双引号”或MySQL(以及其他一些方言)特定的“backticks”分隔。@ThorstenKettner非常感谢。。。但是具有空car\u功能的car\u id为空…
c.car\u id
应该有一个值,
f.car.id
应该为空。我不知道MySQL如何处理
c.*
f.*
。它是显示两个car_id列还是只显示一个?如果它只显示一个,那么它似乎会选择错误的一个。只需显式命名要查看的列,而不是使用
*
;这可以解决这个问题。如果这有助于你解决问题,请考虑将我的答案标记为你的问题的正确答案。这对我们大家都有帮助。帮忙没问题!希望它能解决你的问题。