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

标签 mysql join mariadb rdbms

约束

  • 表格已非规范化
  • 不能使用子查询

表格

名称:地点

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

相关文章:

MySQL 搜索不适用于小字符串

mysql - SQL服务器: How do I combine my rows distinctly

mysql - 在 MySQL 中模拟 DELETE CASCADE?

mysql - 如何使用条件连接优化查询?

Hibernate fetch join -> 无法获取多个包

mysql - Debian 9 如何在没有 MySQL 命名的情况下安装 MariaDB?

mysql - 什么时候切换到 NoSQL?

mysql - SQL查询多个条件

mysql - 使用 JOIN 条件限制 SQL JOIN

mysql - MariaDB 警告 : 'root@localhost' has both . .. 密码将被忽略