php - 优化小型 MySQL 连接查询

标签 php mysql join query-optimization

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

此查询有效,但是加载需要几秒钟;我认为我没有正确编写查询。目前 Venues 大约有 140 行,Locations 有 40,000 行。

    $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 子句中引用 LEFT JOINed 表(c.statec.SOYID)中的列时,您都会强制执行该联接表现得像一个 INNER JOIN。相反,将这些测试作为连接条件的一部分:

"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"

编辑:根据评论,此版本应该允许您删除DISTINCT 要求:

"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"

关于php - 优化小型 MySQL 连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350021/

相关文章:

php - 对从 php 写入数据库的响应缓慢

mysql - 在一个表上进行单个 mysql 选择,但对一列进行 ASC 和 DESC 两次排序?

MYSQL 将转义的十六进制字符串转换为人类可读的字符串

php - 禁用和启用 onclick 事件不适用于多行

php - "Paginating"具有动态定义的按钮数量的滚动选项卡组

php - WordPress 问题 - 每次我登录管理员时,siteurl 和 home 选项都会更改

sql - 在 Oracle 中添加冗余连接条件会导致不同的计划

php - 如何使用一张表的连接获取唯一行?

python - 有没有办法在执行连接操作时证明子字符串的合理性

php - 如何在 PHP 中显示 MySQL 查询的执行时间?