簡體   English   中英

有沒有更好的方法使用內部連接命令進行此mysql查詢?

[英]Is there a better way to make this mysql query using inner join commands?

在我的數據庫中,我有幾個表,它們之間具有“多對多”的關系,彼此之間相互引用,而教我進行此查詢的方法是通過嵌入式查詢。

我一直在閱讀“多對多”關系,以及如何使用“內部聯接”查詢它們,但是,我似乎無法找到適合我要查找的查詢,因為我的數據庫會使用非常大的表,我不希望我的代碼出現性能問題。

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'
                                                )
                            )

我知道擁有嵌入式查詢是一種性能殺手,但這是我可以確定如何從表中獲取所需信息的唯一方法。 有誰知道如何使用“內部聯接”命令獲得相同的結果?

結果表應該看起來像這樣

這是表的所有數據內容

我會給您一個入門,希望您能弄清楚它是如何工作的:

這個:

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;

試試這個,沒有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'

認為這是等效的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%保證給出與IN操作中存在某種隱式DISTINCT相同的結果。


“關閉”是指:

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

似乎與此等效: recursos.recurso = 'Audiovisual'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM