我正在尝试从表格中显示书籍列表( 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不存在于集合表中。但那可能太多了......
感谢您的帮助。
问候。
答案 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到集合表是外键..