使用GROUP_CONCAT输出进行子查询

时间:2013-11-22 05:44:24

标签: mysql subquery group-concat

我遇到了问题,我的查询中有以下行

CONCAT('',
      (SELECT GROUP_CONCAT(DISTINCT trips_loads_rel.load_id,'') AS x 
      FROM `trips_loads_rel` WHERE trips_loads_rel.trip_id = trips.Id)
) AS loads

它显示8,10,27(即数字ID),trips_loads_rel表中的一些ID。它工作正常。但是,如何使用该输出从其他表中提取匹配的记录?我的意思是,这行显示了所有的ID,但是我需要查询其他表来提取相关记录。实际上我不需要这些ID,我需要他们的匹配记录......

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT * FROM <other_table> WHERE <other_table>.load_id IN(CONCAT('',
     (SELECT GROUP_CONCAT(DISTINCT trips_loads_rel.load_id,'') AS x 
    FROM `trips_loads_rel` WHERE trips_loads_rel.trip_id = trips.Id)
) AS loads)

答案 1 :(得分:0)

它看起来像是查询的一部分,而不是整个查询的一部分,因此难以显示确切的语法,但如果您想使用这些值来查找其他行,则不要将它们连接起来进行分组。

而是直接使用它们做类似的事情;

SELECT * FROM `other_table` WHERE `other_table`.`load_id` IN
  (SELECT `load_id` FROM `trips_loads_rel` WHERE `trip_id` = `trips`.`Id`)

答案 2 :(得分:0)

您可以使用FIND_IN_SET(col, 'csv as string')功能获得所需的结果。

示例

mysql> select find_in_set( 2, '11,12,13,14,15,2' );
+--------------------------------------+
| find_in_set( 2, '11,12,13,14,15,2' ) |
+--------------------------------------+
|                                    6 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set( 2, '2,11,12,13,14,15,2' );
+----------------------------------------+
| find_in_set( 2, '2,11,12,13,14,15,2' ) |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> Select FIND_IN_SET( 6, '1,12,3,14,5,16,7,18,9,0,2,13,4,15,6,17,8' );
+--------------------------------------------------------------+
| FIND_IN_SET( 6, '1,12,3,14,5,16,7,18,9,0,2,13,4,15,6,17,8' ) |
+--------------------------------------------------------------+
|                                                           15 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

对于您的查询,您可以传递连接的输出'8,10,27'以与other_table的列进行比较。

Select find_in_set( other_table.col_name, '8,10,27' );

参阅 MySQL String Functions: FIND_IN_SET()