跨2个表的Mysql SQL查询 - 不确定如何正确执行

时间:2009-05-26 15:10:43

标签: php sql mysql

我设置了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”
  3. 我假设有办法做到这一点,比如......

    SELECT 
        thread.due_date 
    FROM
        product, thread 
    WHERE 
        thread.user_id='5' 
    OR 
        // not sure how to finish it
    

    到目前为止,我只是使用PHP来实现这一点,但是我真的希望将SQL知识提升一个档次,并尽可能通过SQL实现。

    谢谢 -

3 个答案:

答案 0 :(得分:3)

您应该可以使用外部联接来执行此操作:

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)

答案 1 :(得分:1)

我会做类似的事情:

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 - 它有关于这两个标准的一些很好的信息。

答案 2 :(得分:0)

SELECT thread.* LEFT OUTER JOIN product ON thread.prod_id=product.id WHERE thread.user_id=5 OR product.user_id=5;

我不确定SELECT线程。*但它有意义,因为该表。* stuff在GRANTing权限时有用。