假设我有一张这样的桌子,有一对多的关系
表1

  id | name
   1 | as
   2 | df
   3 | gh


  id | othercontents | table1relationship
   1 | qw            | 1
   2 | er            | 2
   3 | ty            | 3
   4 | ui            | 3

如果我对Table1运行select查询,对Table2使用左连接,但将其限制为3个结果,那么将返回3行
1-as-qw
2-测向仪
3-高-低
不管我想要什么
1-as-qw
2-测向仪
3-生长激素-[ty,ui]
现在,我正在正常选择它,然后自己将其他内容放入一个数组中,将我的行转换为我想要的行,但问题仍然是我不能返回我想要的所有行。
从逻辑上讲,我想我希望限制到X unique table1.id,而不是只限制到X行,但是如果可能的话,我不知道如何实现这个逻辑。
当然,如果我选择数据库中的所有内容,然后用PHP对其进行排序,这很容易,但这太密集了,我不想只选择20000行就得到~10行。我想一个老生常谈的办法是选择30行,然后自己排序,然后按我的要求返回10行,但对我来说,选择超出我需要的行似乎还是很愚蠢的。
也许值得一提,但是我使用的是Symfony3 w/docine和query builder。但我并不是要求复制/粘贴我的问题的答案,而只是一个方向的推动,以便我可以在我的实现工作。
谢谢

最佳答案

下面是一个查询,它将给出结果(如果我理解正确的话)。

SELECT t1.id,t1.name,
    CONCAT( IF(sum(1)>1,'[',''), GROUP_CONCAT(t2.othercontents), IF(sum(1)>1,']','')) AS name2
FROM (
    SELECT *
    FROM table1
    LIMIT 3
    ) as t1
LEFT JOIN table2 t2 on t2.table1relationship = t1.id
GROUP BY t2.table1relationship;

样品
mysql> SELECT * from table1;
+----+------+
| id | name |
+----+------+
|  1 | as   |
|  2 | df   |
|  3 | gh   |
+----+------+
3 rows in set (0,00 sec)

mysql> SELECT * from table2;
+----+---------------+--------------------+
| id | othercontents | table1relationship |
+----+---------------+--------------------+
|  1 | qw            |                  1 |
|  2 | er            |                  2 |
|  3 | ty            |                  3 |
|  4 | ui            |                  3 |
+----+---------------+--------------------+
4 rows in set (0,00 sec)

结果
mysql> SELECT t1.id,t1.name,
    ->     CONCAT( IF(sum(1)>1,'[',''), GROUP_CONCAT(t2.othercontents), IF(sum(1)>1,']','')) AS name2
    -> FROM (
    ->     SELECT *
    ->     FROM table1
    ->     LIMIT 3
    ->     ) as t1
    -> LEFT JOIN table2 t2 on t2.table1relationship = t1.id
    -> GROUP BY t2.table1relationship;
+----+------+---------+
| id | name | name2   |
+----+------+---------+
|  1 | as   | qw      |
|  2 | df   | er      |
|  3 | gh   | [ui,ty] |
+----+------+---------+
3 rows in set (0,00 sec)

mysql>

09-11 10:51