【问题标题】:Is there a better way to make this mysql query using inner join commands?有没有更好的方法来使用内部连接命令进行这个 mysql 查询?
【发布时间】:2016-08-15 03:48:27
【问题描述】:

在我的数据库中,我有几个表具有相互引用的“多对多”关系,而我被教导进行此查询的方式是通过嵌入式查询。

我一直在阅读“多对多”关系,以及如何使用“内部联接”查询它们,但是,我似乎无法找到适合我正在寻找的查询,因为我的数据库将使用非常大的表我不希望我的代码出现性能问题。

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

【问题讨论】:

  • sqlfiddle.com 请提供一些测试数据并显示所需的输出。
  • 对“逗号连接”说不

标签: mysql inner-join relationships


【解决方案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;

【讨论】:

    【解决方案2】:

    认为这是等效的 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'

    【讨论】:

      【解决方案3】:

      试试这个,没有 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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多