MySQL在连接列中连接具有多个重复值的表

时间:2016-04-21 00:12:57

标签: mysql join mariadb rdms

约束

  • 表格被去规范化
  • 无法使用子查询

表格

名称:地点

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

问题

  • 位置地址将在多行中重复state
  • 位置表大约有100万行,地址表大约有1M行。

问题

我需要从位置表中获取states的{​​{1}}唯一列表,其中地址表格中各个info

我所拥有的任何联接,不使用子查询,都会永远占用。

哪些查询符合约束

2 个答案:

答案 0 :(得分:1)

子查询是一个性能问题,这是一个神话。有时他们是;有时他们不是。没有这么简单的规则。

在你的情况下,我可能会建议:

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)上的索引。

有两个子查询,但有了适当的索引,这可能只是表达这种逻辑的最快方式。

答案 1 :(得分:0)

您可以使用:

SELECT state, info FROM locations LEFT JOIN addresses USING (state) WHERE address_one IS NOT NULL GROUP BY state;

该查询不使用子查询。