使用 WHERE 或 JOIN 从不同的表中选择?
Posted
技术标签:
【中文标题】使用 WHERE 或 JOIN 从不同的表中选择?【英文标题】:SELECT from different tables with WHERE or JOIN? 【发布时间】:2016-07-07 03:47:52 【问题描述】:我想从 6 个表中选择信息我有 2 个选择 第一个带有 where 语句:
SELECT columns
FROM db1,
db2,
db3,
db4,
db5,
db6
WHERE db1.id = $user_id
OR db2.user_id = $user_id
OR db3.user_id = $user_id
OR db4.user_id = $user_id
OR db5.user_id = $user_id
OR db6.user_id = $user_id
$user_id
是包含 user_id 的 php 1variable`;
Second Choice 连接表和一个 where 语句: like here 哪一个是快速、有用和清晰的?我想得到快速的结果,因为我也会用非常复杂的查询来做那种查询
【问题讨论】:
交叉加入六个不同的表对我来说就像炸弹 我相信你实际上是在这里做一个CROSS JOIN
,至少对于一些表。这是你想要的吗?
不清楚你想要什么。你能提供样本数据和预期的结果集吗?正如@Prdp 提到的那样,交叉加入六个表并不是一个好主意。所以你可能想在这里考虑一下你的方法。
我只想从不同的表中获取特定用户的所有信息,因为我会将它们存储在会话中,而不是每次都发送请求并始终从会话 @CoderofCode 获取数据。
@Prdp 我正在尝试设计如下:分离所有信息,因为我想针对高流量问题实现非常快速的 sql,例如名称表(包含用户的名字、姓氏 user_id)或生日表(其中包含年日月user_id)和其他:我想将所有内容分开,因为在某些情况下,我只需要从数据库名称或生日或任何特定的东西中获取。不是为快速表设计的吗?因为我认为连接表对sql来说没有任何意义?不是吗?使用联合从不同的表中获取数据是否繁重?
【参考方案1】:
你想这样做
SELECT columns
FROM db1
WHERE id = $user_id
UNION
SELECT columns
FROM db2
WHERE id = $user_id
UNION
SELECT columns
FROM db3
WHERE id = $user_id
UNION
SELECT columns
FROM db4
WHERE id = $user_id
UNION
SELECT columns
FROM db5
WHERE id = $user_id
UNION
SELECT columns
FROM db6
WHERE id = $user_id
在所有 6 个表的 id 列上放置一个索引。这将具有 O(N) 或更快的性能。
如果您想从多个表中获得相同的结果(例如保留重复项),您也可以使用UNION ALL
而不是UNION
。 UNION ALL
要快得多,如果可以,请使用它。
您的查询将交叉连接所有表并具有 O(N^6) 的性能,我相信您已经发现了。
【讨论】:
在这种情况下 UNION 比 OR 快吗?(我有所有 idis 的主键)?我正在尝试设计如下:分离所有信息,因为我想为高流量问题实现非常快的 sql,例如名称表(包含用户的名字、姓氏 user_id)或生日表(包含年日月 user_id)等:我想将所有内容分开,因为在某些情况下,我只需要从数据库名称或生日或其他任何特定内容中获取。不是为快速表设计的吗?因为我认为连接表对 sql 来说没什么?不是吗?它很重吗?来自不同表的数据与联合? @john -- 按你的方式做会很慢。这就是我发布这个答案的原因。请随时再问我一次——我仍然会给出相同的答案。您没有进行联接——联接将涉及ON x = y
语句和JOIN
关键字。您正在执行所谓的交叉连接——即每张表中每一行与其他每一行的每一种组合。结果集将有 (# rows in db1) x (# rows in db2) x ... x (# rows in db6)
我的sql设计慢吗?我只是设计它,因为我有很多信息和很多表。实际上第一次我的设计就像一个表100列(就像炸弹:))但是它只是测试,很多人建议这不是好的设计,这就是为什么我将需要单独的信息分开。但在某些情况下我应该将它们与 UNION 连接起来?我应该如何在sql中设计那种信息?
听起来你有一个标准的非规范化设计。在这样的设计中,会有一个用户表,每个用户都有一行——您不需要查看所有表。如果不是这样,那么你的设计就不好
我只是设计它,因为我有很多信息和很多表格。实际上第一次我的设计就像一个表格 100 列(就像炸弹 :) )但它只是测试和很多的人建议这不是好的设计,这就是为什么我分开我将需要单独的信息。我分开是因为很多情况我只需要单独选择名称或配置文件但有些情况我应该将它们与 UNION 联系起来以上是关于使用 WHERE 或 JOIN 从不同的表中选择?的主要内容,如果未能解决你的问题,请参考以下文章
从 Snowflake 中的表中选择随机百分比(使用 WHERE 子句时)
IN SQL INNER JOIN 可以添加两个不同列的表吗?
如何使用 join 和 where 子句从表中删除? [复制]
从 LEFT JOIN 设置 NULL 列的默认值并使用 WHERE 过滤