gpt4 book ai didi

php - 优化小型 MySQL 连接查询

转载 作者:行者123 更新时间:2023-11-29 02:34:32 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com