基本上我有两个表格:
table1
id| name
1 Test
2 Something
3 More
表
id| table1_id
1 1
2 1
3 1
4 2
5 2
6 3
现在我需要这样的结果:
name | table2.id
Test 1
2
3
Something 4
5
More 6
所以基本上没有第一个表的重复条目。所以结果和加入它是一样的,只是没有多次显示名字。这是可能的MySQL或我应该过滤它在PHP?我知道这在PHP中是可能的,但我想知道这样的东西是否可以在MySQL中实现,如果是这样的话,我想知道要寻找什么。我在想一些有DISTINCT和/或左或右连接的东西。
所以,你问MySQL是否有可能,我在评论中回答说有可能。如果你的问题是我如何只用MySQL完成这个,这里是:
SELECT
tmp.name,
tbl2.id
FROM
tbl2
LEFT JOIN (
SELECT
tbl2.id AS id,
tbl1.`name` AS name
FROM
tbl2
INNER JOIN tbl1 ON tbl1.id = tbl2.tbl1_id
GROUP BY
tbl2.tbl1_id
) AS tmp ON tbl2.id = tmp.id;
希望这是你想要的。
作为@roberto06建议,此查询返回NULL
而不是重复项,但如果您不喜欢NULL
s并想要一个空字符串,您可以将SELECT tmp.name
更改为SELECT IFNULL(tmp.name,'')
这个怎么样?
SELECT
*,
(SELECT GROUP_CONCAT(CONCAT(`id`) separator '|') AS table2_ids
FROM table2 WHERE table1_id = table1.id) AS m
FROM table1
在PHP中,你只需要explode('|', $mvar)
找到了!
SELECT (
SELECT
IF(COUNT(t2_2.table1_id) = 1, t1.name, '')
FROM table2 t2_2
WHERE t2_2.id <= t2.id
AND t2_2.table1_id = t1.id
) AS name,
t2.id
FROM table1 t1
LEFT JOIN table2 t2 ON t2.table1_id = t1.id
结果:
name | .id
----------+-----
Test | 1
| 2
| 3
Something | 4
| 5
More | 6
解释:
- 这将计算
t2_2
中t2_2.id
小于或等于实际t2.id
且t2_2.table1_id
等于t1.id
的table1_id
的出现次数- 这将返回
1, 2, 3, 1, 2, 1
在表格示例中
- 这将返回
- 如果计算结果为
1
,则输出t1.name
,否则输出空字符串。
我不知道它是否足够清晰,我很确定性能可以提高,但是,嘿,它有效。
这是一个显示查询结果的问题,所以我会选择PHP,它比MySQL更擅长处理这个问题。
像这样:
select distinct t1.name, t2.id
from table1 as t1 outer right join table2 as t2 on t1.id = t2.table1_id
你可以试试…
select A.name,B.id from table1 A
right join table2 B on A.id=B.table1_id