最有效的JOIN查询 - MySQL

时间:2013-10-02 01:17:05

标签: php mysql sql join

下面是我正在努力工作的两张非常大的桌子的简单过度简化。

campaign

| id | uid | name | contact | pin | icon |
| 1  | 7   | bob  | ted     | y6w | yuy  |
| 2  | 7   | ned  | joe     | y6e | ygy  |
| 3  | 6   | sam  | jon     | y6t | ouy  |

records

| id | uid | cid | fname | lname | address | city | phone |
| 1  | 7   | 1   | lars  | jack  | 13 main | lkjh | 55555 |
| 2  | 7   | 1   | rars  | jock  | 10 maun | oyjh | 55595 |
| 2  | 7   | 1   | ssrs  | frck  | 10 eaun | oyrh | 88595 |

页面循环通过记录表并将结果打印到HTML表。由于某种原因,现有代码会为每条记录"select name from campaign where id = $res['cid']"执行单独的查询。我想摆脱第二个查询并进行某种联接,但最有效的方法是什么?< / p>

我需要

SELECT * FROM records

以及

SELECT name FROM campaigns WHERE campaigns.id = records.cid

在单个查询中。

我怎样才能有效地做到这一点?

4 个答案:

答案 0 :(得分:2)

只需加入两个表格即可。您已经拥有所需的WHERE条件。从一个列中选择所有列,但从另一列中仅选择一列。像这样:

SELECT records.*, campaigns.name
FROM records, campaigns
WHERE campaigns.id = records.cid

请注意,没有匹配广告系列的记录行会丢失。为避免这种情况,请将您的查询改为:

SELECT records.*, campaigns.name
FROM records LEFT JOIN campaigns
ON campaigns.id = records.cid

现在,您将获得NULL个名称,而不是缺少行。

答案 1 :(得分:2)

“最有效”的部分是答案变得非常棘手。通常,一个很好的方法是简单地在两个表上写一个带有连接的查询,并愉快地跳过关于小猫的歌曲。但是,它确实取决于更多因素。这些表有多大,它们是否在查询的右列上很好地编入索引?查询运行时,生成了多少条记录?结果是在查询中排序的吗?

这是开始对科学有点艺术的地方。查看解释计划,了解正在发生的事情,寻找使其更高效或更简单的方法。有时在from子句中运行两个子查询,每个子查询只生成一个数据子集,比尝试连接整个表并从那里选择所需的数据要高效得多。

要更详细地回答这个问题,虽然希望对您的特定情况准确,但需要更多信息。

如果我猜测数据库中的某些内容,如果您的表少于几百万行且数据库性能不错,我建议使用简单连接。如果你多次重新运行EXACT查询,那么即使很慢的查询也可以被MySQL非常好地缓存,所以也要看一下。我有一个应用程序在一个非常规格的机器上运行,在那里我编写了一个cron作业,只是运行一些查询,其中包含一夜之间加载的新数据,并且所有用户都认为查询是即时的,因为我确保它们被缓存。有时真正有所收获的是小动作。

最后,如果您实际上刚开始使用SQL或者不像您认为的那样熟悉,那么您可能会want to read this Q&A that I wrote覆盖查询中的许多基本到中间topcs,例如连接,子查询,聚合查询以及基本上需要了解的更多东西。

答案 2 :(得分:1)

您可以使用此查询

SELECT records.*, campaigns.name
FROM records, campaigns
WHERE campaigns.id = records.cid

但是,使用INNER JOIN(新的ANSI标准,ANSI-92)要好得多,因为它更具可读性,您可以轻松地将INNER替换为LEFT或其他类型的连接。

SELECT records.*, campaigns.name
FROM records INNER JOIN campaigns
ON campaigns.id = records.cid

此处有更多解释:

  1. SQL Inner Join. ON condition vs WHERE clause
  2. INNER JOIN ON vs WHERE clause

答案 3 :(得分:0)

SELECT *
FROM records
LEFT JOIN campaigns
on records.cid = campaigns.id;

使用左连接而不是内连接可确保您仍会列出每个记录条目。