下面是我正在努力工作的两张非常大的桌子的简单过度简化。
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
在单个查询中。
我怎样才能有效地做到这一点?
答案 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
此处有更多解释:
答案 3 :(得分:0)
SELECT *
FROM records
LEFT JOIN campaigns
on records.cid = campaigns.id;
使用左连接而不是内连接可确保您仍会列出每个记录条目。