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列还是只显示一个?如果它只显示一个,那么它似乎会选择错误的一个。只需显式命名要查看的列,而不是使用*
;这可以解决这个问题。如果这有助于你解决问题,请考虑将我的答案标记为你的问题的正确答案。这对我们大家都有帮助。帮忙没问题!希望它能解决你的问题。