2016-04-21 9 views
0

在我的數據庫中,我有幾個表「多對多」關係互相引用,我教這個查詢的方式是通過嵌入式查詢。

我一直在閱讀關於「多對多」關係,以及如何使用「Inner Join」查詢它們,但我似乎無法找到符合我所尋找的查詢,我的數據庫將與非常大的表一起工作,我不希望我的代碼出現性能問題。有沒有更好的方式來使用內部連接命令進行這個mysql查詢?

SELECT salones.idSalon, 
     salones.Lat, 
     salones.Long, 
     recursos.idRecurso, 
     recursos.Recurso 
FROM salones, 
    recursos, 
    salones_has_recursos 
WHERE salones_has_recursos.salones_idSalon=salones.idSalon 
    AND salones_has_recursos.recursos_idRecurso=recursos.idRecurso 
    AND recursos.idRecurso IN (SELECT idRecurso 
          FROM salones_has_recursos 
          WHERE idRecurso IN (SELECT idRecurso 
               FROM recursos 
               WHERE recurso = 'Audiovisual' 
               ) 
          ) 

我知道有嵌入的查詢是一個性能殺手,但是這是我能想出如何讓我從表中需要的信息的唯一途徑。有誰知道如何使用「內部連接」命令獲得相同的結果?

The resulting table should look a little like this

This is the all the data content of the tables

+0

sqlfiddle.com一些測試數據並顯示所需的輸出,請。 –

+0

只對「逗號加入」說不。 – Uueerdo

回答

0

試試這個,這是很難對其進行測試,而不sqlfiddle但試試這個吧。

SELECT salones.idSalon, 
     salones.Lat, 
     salones.Long, 
     recursos.idRecurso, 
     recursos.Recurso 
FROM salones 
    INNER JOIN salones_has_recursos ON salones_has_recursos.salones_idSalon=salones.idSalon 
    INNER JOIN recursos ON salones_has_recursos.recursos_idRecurso=recursos.idRecurso 
    AND recursos.idRecursor = salones_has_recursors.idRecurso 
    AND recursos.recurso = 'Audiovisual' 
1

我給你的希望首發,你可以弄清楚它是如何工作:

此:

select idRecurso from salones_has_recursos where idRecurso in 
(select idRecurso from recursos where recursos = 'Audiovisual'); 

變爲:

select 
    s.idRecurso 
from 
    salones_has_recursos s 
    inner join recursos r 
    on s.idRecurso = r.idRecurso 
    where r.recursos = 'Audiovisual'; 

我可以不保證它不起作用,無法測試,但我認爲這是您的完整解決方案:

SELECT 
    s.idSalon, 
    s.Lat, 
    s.Long, 
    r.idRecurso, 
    r.Recurso 
FROM 
    salones s 
    inner join recursos r 
    on s.idRecurso = r.idRecurso 
    and r.recursos = 'Audiovisual' 
    inner join salones_has_recursos sr 
    on sr.salones_idSalon=s.idSalon 
    and sr.recursos_idRecurso=r.idRecurso; 
0

認爲這是等同的JOIN查詢。 r1,shr1和r2的加入對我來說似乎有點「偏離」;我不確定那是因爲我在轉換它的過程中出現了錯誤,還是因爲它是從原來的結果繼承而來的。

SELECT s2.idSalon, 
     s2.Lat, 
     s2.Long, 
     r2.idRecurso, 
     r2.Recurso 
FROM recursos AS r1 
INNER JOIN salones_has_recursos AS shr1 ON r1.idRecurso = shr1.idRecurso 
INNER JOIN recurso AS r2 ON shr1.idRecurso = r2.idRecurso 
INNER JOIN salones_has_recursos AS shr2 ON r2.idRecurso = shr2.recursos_idRecurso 
INNER JOIN salones AS s2 ON shr2.salones_idSalon=s2.idSalon 
WHERE r1.recurso = 'Audiovisual' 
; 

它也不能100%保證給相同的結果有幾分的隱DISTINCTIN操作。


通過 「關閉」 我的意思是這樣的:

recursos.idRecurso IN (SELECT idRecurso 
          FROM salones_has_recursos 
          WHERE idRecurso IN (SELECT idRecurso 
               FROM recursos 
               WHERE recurso = 'Audiovisual' 
               ) 
          ) 

似乎是相同的: recursos.recurso = 'Audiovisual'

相關問題