[英]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.