约束
- 表格已非规范化
- 不能使用子查询
表格
名称:地点
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | 0 | auto_increment |
| zip_code | varchar(12) | NO | | | |
| city | varchar(64) | NO | MUL | | |
| county | varchar(64) | NO | MUL | | |
| state | varchar(64) | NO | MUL | | |
| info | varchar(99) | NO | | | |
+-----------+-------------+------+-----+---------+----------------+
名称:地址
+------------------+---------------+------+-----+-------+-----------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------------+------+-----+-----------+-------+
| id | int(11) | NO | PRI | 0 | |
| address_one | varchar(255) | NO | | | |
| address_two | varchar(255) | NO | | | |
| city | varchar(30) | NO | MUL | | |
| state | varchar(25) | NO | MUL | | |
| zip_code | varchar(7) | NO | MUL | NULL | |
| country_code | char(2) | YES | | | |
+------------------+---------------+------+-----+-----------+-------+
问题
- 表位置和地址将在许多行中重复
状态
。 - Locations 表大约有 10 万行,Addresses 表大约有 100 万行。
问题
我需要从位置表中获取州
的唯一列表及其信息
,其中中至少有一个地址任何相应状态
的em>地址表。
我拥有的任何连接,如果不使用子查询,最终都会花费很长时间。
什么查询将满足约束?
最佳答案
认为子查询是性能问题是一个神话。有时是;有时他们不是。没有这么简单的规则。
对于你的情况,我可能建议:
select l.*
from (select distinct state, info
from locations l
) l
where exists (select 1
from addresses a
where a.state = l.state
);
为了提高性能,您需要在 locations(state, info)
和 addresses(state)
上建立索引。
有两个子查询,但是有了适当的索引,这可能是表达此逻辑的最快方法。
关于MySQL 连接表中连接列中有多个重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757405/