跨 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”

mysql数据库表的查询

SQL - 依赖于 2 个表的查询?

如何使用 3 个表在 SQL 查询中获得完整结果,其中 1 个表保持 2 个表的关系?

MySQL JOIN 2 个表并分别获取两个表的总和

SQL Server:根据来自其他 2 个表的子查询从表中选择