我有2个表(组和属性),其中组具有多个按ID列出的属性(即:1,2,3,..),当列出它们时,我想显示属于每个组的属性。
问题恰好在子查询中,它仅返回第一项。如果我手动输入值(即:1、5、9 ...),它将正确返回,但是在使用父查询字段(groups.attributes)时会发生错误。
抱歉,我最初发布此问题时未遵循社区标准,因此我不习惯在这里提问。
ID NAME ATTRIBUTES
1 Shoes 1,2,3
2 Pants 4,5
...
ID IDENTIFIER
1 Size
2 Color
3 Voltage
...
SELECT
G.id, G.name,
COALESCE(
(SELECT GROUP_CONCAT(A.name SEPARATOR ', ') FROM attributes A WHERE A.id IN (G.attributes)),
'-'
) AS attributes_names
FROM
groups G
肯定会有一个更好的建议或解决方案,使我眼前看不到。
您必须使用,FIND_IN_SET
因为ATTRIBUTES是字符串。
IN
子句需要单个参数,因此仅(IN(1,2,3)或IN('1','2','3')
还请仔细看一看,是否在数据库列中存储分隔列表真的那么糟糕吗?然后考虑标准化表格,这将使查询更加容易。
最后一个GROUPS是MySQL中的保留字,您应避免使用这些
CREATE TABLE `GROUPS` (`ID` int, `NAME` varchar(5), `ATTRIBUTES` varchar(5)) ; INSERT INTO `GROUPS` (`ID`, `NAME`, `ATTRIBUTES`) VALUES (1, 'Shoes', '1,2,3'), (2, 'Pants', '4,5') ;
CREATE TABLE ATTRIBUTES (`ID` int, `IDENTIFIER` varchar(7)) ; INSERT INTO ATTRIBUTES (`ID`, `IDENTIFIER`) VALUES (1, 'Size'), (2, 'Color'), (3, 'Voltage'), (4, 'length'), (5, 'wifdth') ;
SELECT G.id, G.name, COALESCE( (SELECT GROUP_CONCAT(A.IDENTIFIER SEPARATOR ', ') FROM ATTRIBUTES A WHERE FIND_IN_SET (A.ID,G.attributes)), '-' ) AS attributes_names FROM `GROUPS` G
id | 名称| attribute_names- :| :---- | :------------------- 1 | 鞋子| 尺寸,颜色,电压 2 | 裤子| 长度,宽度
SELECT GROUP_CONCAT(A.IDENTIFIER SEPARATOR ', ') FROM ATTRIBUTES A WHERE FIND_IN_SET (A.ID,'1,2,3')
| GROUP_CONCAT(A.IDENTIFIER SEPARATOR',')| | :---------------------------------------- | | 尺寸,颜色,电压|
db <>在这里拨弄
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句