左边连接过滤器

时间:2015-03-10 00:26:02

标签: php mysql join

我正在尝试从表格中显示书籍列表( books )但是如果用户连接的书籍在他的收藏中添加了书籍,我想以绿色显示书籍的名称。集合位于表集合中。所以我需要从 books 表中检索所有信息,但我需要区分用户拥有的书籍。

我试过这样的事情:

SELECT * FROM books LEFT JOIN collection ON books.ID = collection.ID_book AND collection.ID_member = :ID_member WHERE books.ID_author = :ID_author

:ID_member是登录成员的会话中的ID,ID_author是我想要显示列表的作者的名称。但是使用该查询,我无法检索用户不拥有的书籍的ID。你有想法检索这些ID吗?

我想到了while()中的第二个查询,但这意味着查询PER book ...


编辑(更多信息):

我有一张表 books ,其中包含有关书籍的所有信息。 然后,我有一个表集合,其中包含以下列: ID,ID_member,ID_book

根据我的疑问,如果我要显示所有书籍......让我们说斯蒂芬金,我有类似的东西:

book || ID of the book || book owned by the user
1    || 1              || 0
2    || 2              || 0 
3    ||                || 1
4    || 4              || 0 
5    ||                || 1 
6    || 6              || 0  

我要显示的ID是collection.ID_book,因为如果我显示ID,它将显示collection.ID

因为你可以看到用户拥有这本书的时候我不能拥有这本书的ID ......但我可以显示其他信息(比如书名),因为其他信息来自书籍表和收集表中的ID ......太糟糕了,无法在

中选择表格

据我所知,问题是两列中都存在ID列。一种解决方案可能是复制ID列,如ID2。然后它将起作用,因为ID2不存在于集合表中。但那可能太多了......

感谢您的帮助。

问候。

4 个答案:

答案 0 :(得分:1)

我认为你的查询应该做你想要的。我怀疑问题可能是select *和多个具有相同名称的列。这个查询是否符合您的要求?

SELECT b.*,
       (case when c.ID_book is not null then 'GREEN' else 'NOT OWNED' end) as color
FROM books b LEFT JOIN
     collection c
     ON b.ID = c.ID_book AND c.ID_member = :ID_member
WHERE b.ID_author = :ID_author;

答案 1 :(得分:1)

我认为您可以通过稍微更改您的查询来解决此问题,也许可以尝试一下。

SELECT * FROM books 
LEFT JOIN collection ON books.ID = collection.ID_book
WHERE books.ID_author = :ID_author OR collection.ID_member = :ID_member 

在加入用户ID的条件时,您只会在结果集中提供这些行。通过使用WHERE运算符将该条件移动到OR子句,您可以同时满足这两个条件。

注意:尽量不要使用SELECT *

答案 2 :(得分:1)

使用别名设置列非常容易:

SELECT books.ID AS book_id, collections.id AS collection_id 
FROM books 
LEFT JOIN collection ON books.ID = collection.ID_book AND collection.ID_member = :ID_member 
WHERE books.ID_author = :ID_author

完成此操作后,您的列名将是book_id和collection_id,因为它们不再是重复的名称(一个覆盖另一个),您可以访问它们。

然后,如果您知道要books中的所有列,而只需要来自id的{​​{1}}列,您可以执行以下操作:

collection

答案 3 :(得分:0)

    SELECT * FROM books LEFT JOIN collection
    ON books.ID = collection.ID_book 
    INNER JOIN member ON collection.ID_member = member.:ID_member WHERE books.ID_author = :ID_author
先生,你会试试吗......我不确定。我假设ID_member字段来自成员表..而ID_member到集合表是外键..