假设我有一张这样的桌子,有一对多的关系
表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>