Php 优化小型MySQL连接查询

Php 优化小型MySQL连接查询,php,mysql,join,query-optimization,Php,Mysql,Join,Query Optimization,我在场馆表中有一个场馆列表,在位置表中有一个城市/州列表。场地与我所在组织独有的区号关联,称为SOYID。SOYID由一个地理区域组成-Locations表中的每一行都有一个城市、州和相应的SOYID某些场馆行具有SOYID,其他场馆行没有;对于那些没有的场馆,我需要找到列出的城市和州的SOYID。我只想在特定的SOYID中选择这些场馆 这个查询可以工作,但是,加载需要几秒钟;我认为我没有正确地编写查询。目前场馆约有140排,场地约有40000排 $sql = "SELECT DISTI

我在场馆表中有一个场馆列表,在位置表中有一个城市/州列表。场地与我所在组织独有的区号关联,称为SOYID。SOYID由一个地理区域组成-Locations表中的每一行都有一个城市、州和相应的SOYID某些场馆行具有SOYID,其他场馆行没有;对于那些没有的场馆,我需要找到列出的城市和州的SOYID。我只想在特定的SOYID中选择这些场馆

这个查询可以工作,但是,加载需要几秒钟;我认为我没有正确地编写查询。目前场馆约有140排,场地约有40000排

    $sql = "SELECT DISTINCT a.VenueID, a.Name, a.PhotoID, a.City, a.StateAbbr
            FROM Venues AS a LEFT JOIN Locations AS c ON a.City = c.city
            WHERE a.SOYID = '" . mysql_real_escape_string($SOYID) . "'
            OR ((c.city = a.City) AND  (c.state = a.StateAbbr) AND (c.SOYID = '" . mysql_real_escape_string($SOYID) . "'))
            ORDER BY a.Name ASC";

无论何时在WHERE子句中引用左联接表中的列(
c.state
c.SOYID
,在您的特定情况下),都会强制该联接的行为类似于内部联接。相反,将这些测试作为连接条件的一部分:

"SELECT DISTINCT a.VenueID, a.Name, a.PhotoID, a.City, a.StateAbbr
    FROM Venues AS a 
        LEFT JOIN Locations AS c 
            ON a.City = c.city
                AND a.StateAbbr = c.state
                AND c.SOYID = '" . mysql_real_escape_string($SOYID) . "'
    WHERE a.SOYID = '" . mysql_real_escape_string($SOYID) . "'
        OR c.SOYID IS NOT NULL /* LEFT JOIN found a matching row */
    ORDER BY a.Name ASC"
编辑:根据评论,此版本应允许您删除
独特的
要求:

"SELECT a.VenueID, a.Name, a.PhotoID, a.City, a.StateAbbr
    FROM Venues AS a 
    WHERE a.SOYID = '" . mysql_real_escape_string($SOYID) . "'
        OR EXISTS(SELECT NULL
                      FROM Locations AS c 
                      WHERE a.City = c.city
                          AND a.StateAbbr = c.state
                          AND c.SOYID = '" . mysql_real_escape_string($SOYID) . "') 
    ORDER BY a.Name ASC"

我想他现在可以把
DISTINCT
去掉了,不是吗?或者使用a.VenuID的
组,而不是
DISTINCT
@ypercube:是的,我认为删除
DISTINCT
可能是安全的。如果删除DISTINCT,我仍然会得到重复行,因此不,我仍然需要保留DISTINCT。谢谢@John:我添加了一个替代查询,它应该可以消除对distinct的需要。