MySQL连接查询,但不显示第一个表的结果,如果它是重复的


MySQL join query but dont show results from the first table if it's a duplicate

基本上我有两个表格:

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

解释:

  1. 这将计算t2_2t2_2.id小于或等于实际t2.idt2_2.table1_id等于t1.idtable1_id的出现次数
    • 这将返回1, 2, 3, 1, 2, 1在表格示例中
  2. 如果计算结果为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