2016-11-10 43 views
2

所以基本上我有2個表:MySQL的連接查詢,但不從第一個表顯示的結果,如果它是一個重複的

表1

id| name 
1 Test 
2 Something 
3 More 

表2

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和/或左或右連接。

+4

是的,它可能在MySQL –

回答

4

所以,你問是否有可能與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.nameSELECT IFNULL(tmp.name,'')

+0

要麼我做錯了什麼,或者這是不對的。我仍然得到重複tbl1.names – Loko

+0

你有table1重複嗎? –

+0

是的,沒關係。我的最後出了點問題。我弄明白了。有用。 – Loko

-2

這是呈現查詢結果的問題,所以我會選擇PHP,這是在處理這個比MySQL更好。

+1

但是,如果它可能在MySQL中,它會(我認爲)在性能上更好地得到它在查詢中。 – Loko

+0

這是一條評論.. – Garg

+0

我不認爲這很容易在SQL中完成,這就是爲什麼我建議在PHP中完成它。 –

-3

事情是這樣的:

select distinct t1.name, t2.id from table1 as t1 outer right join table2 as t2 on t1.id = t2.table1_id

+0

這顯示了完全相同的結果,因爲它沒有區別,所以它仍然複製了t1.name – Loko

+0

好的,那麼在SQL中是不可能的。 – buratino

-2

你可以嘗試像...

select A.name,B.id from table1 A 
right join table2 B on A.id=B.table1_id 
1

這個是什麼?

SELECT 
*, 
(SELECT GROUP_CONCAT(CONCAT(`id`) separator '|') AS table2_ids 
FROM table2 WHERE table1_id = table1.id) AS m 
FROM table1 

在PHP中,你只需要explode('|', $mvar)

1

找到了!

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. 這將計數的table1_id OCCURENCES的IN t2_2的數,其中t2_2.id比實際t2.id並且其中t2_2.table1_id低於或等於等於到t1.id
    • 因此,這將在你的表例如返回1, 2, 3, 1, 2, 1
  2. 然後它會輸出t1.name如果評估到1和一個空字符串,如果沒有。

我不知道它是否足夠清楚,而且我非常肯定可以提高性能,但嘿,它的工作原理。

相關問題