跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行
Posted
技术标签:
【中文标题】跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行【英文标题】:Mysql SQL Query Across 2 Tables - Not Sure How to Do It Properly 【发布时间】:2009-05-26 15:10:43 【问题描述】:我有 2 个这样设置的表(省略了不相关的行):
> product
- id
- user_id
> thread
- id
- prod_id
- user_id
- due_date
现在我想创建一个查询,从线程表中选择所有行:
-
thread.user_id 为(例如)“5”
有一个 prod_id,其中 product.user_id 为“5”
我假设有办法做到这一点,比如 ...
SELECT
thread.due_date
FROM
product, thread
WHERE
thread.user_id='5'
OR
// not sure how to finish it
到目前为止,我只是使用 php 来执行此操作,但我真的很想将我的 SQL 知识提高一个档次,并尽可能通过 SQL 来实现。
谢谢-
【问题讨论】:
【参考方案1】:您应该能够使用外连接来执行此操作:
SELECT thread.* FROM thread
LEFT OUTER JOIN product
ON thread.prod_id = product.id
WHERE thread.user_id = 5 OR product.user_id = 5
您可能会发现一个问题是,如果线程的用户 ID 为 5,但产品的用户 ID 为 5,您可能会得到重复的线程。但不确定这是否会成为您的问题。您也许可以使用 SELECT DISTINCT
删除这些(感谢 Alex Martelli)
【讨论】:
如果可能存在重复问题,SELECT DISTINCT
而不是普通的SELECT
可能会有所帮助。
结合 SELECT DISTINCT 的想法,这完全符合我的需要 - 谢谢!【参考方案2】:
我会这样做:
SELECT t.due_date
FROM thread t
INNER JOIN product p ON p.id = t.prod_id
WHERE t.user_id = 5 OR p.user_id = 5
编辑: 我的示例是使用 SQL 92 标准。如果您想坚持使用原始帖子中的 SQL-89 样式连接,您可以执行以下操作:
SELECT thread.due_date
FROM product, thread
WHERE product.id = thread.prod_id
AND (thread.user_id = 5 OR product.user_id = 5)
不过,请查看Beginning mysql - 它包含有关这两个标准的一些很好的信息。
【讨论】:
如果你使用内连接,你只会得到对应产品的线程【参考方案3】:SELECT thread.* LEFT OUTER JOIN product ON thread.prod_id=product.id WHERE thread.user_id=5 OR product.user_id=5;
我不确定 SELECT 线程。* 但它是有道理的,因为该表。* 在授予权限时工作。
【讨论】:
以上是关于跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行的主要内容,如果未能解决你的问题,请参考以下文章
跨 3 个表的 MySQL 外键“ON DELETE CASCADE”