【问题标题】:Mysql SQL Query Across 2 Tables - Not Sure How to Do It Properly跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行
【发布时间】:2009-05-26 15:10:43
【问题描述】:

我有 2 个这样设置的表(省略了不相关的行):

> product
  - id
  - user_id

> thread
  - id
  - prod_id
  - user_id
  - due_date

现在我想创建一个查询,从线程表中选择所有行:

  1. thread.user_id 为(例如)“5”
  2. 有一个 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 来实现。

谢谢-

【问题讨论】:

    标签: php sql mysql


    【解决方案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 线程。* 但它是有道理的,因为该表。* 在授予权限时工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2019-05-10
      • 2015-04-17
      相关资源
      最近更新 更多