【问题标题】:MYSQL/PHP: Possible to Join on One to Many Field?MYSQL/PHP:可以加入一对多字段吗?
【发布时间】:2017-12-11 15:16:04
【问题描述】:

我有三张桌子,作者、书籍和借来的。每个作者都有多本书。一本书可能会或不会出现在借来的桌子上。这是架构:

作者

id|authornamename

书籍

id|bookname|authorid

借来的

id|bookid|borrowerid|onloan //onloan is a boolean

每当一本书被借阅时,它都会出现在借阅表中。但是,借来的表中只出现了一些书籍。如果曾经借过,它们的贷款价值可以达到TRUEFALSE

以下查询返回一个作者列表,其中每个作者都有一个以逗号分隔的 bookid 和 booknames 列表:

SELECT 
a.*,a.id as `authorid`, bookids,booknames 
from authors `a` 
LEFT JOIN (
  SELECT group_concat(id ORDER BY id ASC) as `bookids`,
group_concat(bookname ORDER BY id ASC) as `booknames` 
   FROM   books
   GROUP  BY authorid
   ) b ON b.authorid = a.id 
GROUP BY a.id";

如果借用表中没有每本书的条目,我怎么能得到每本书是否被借的列表(外借字段)?我希望外借列表具有与书籍相同数量的条目,因此我可以判断一本书是否在给定时间外借。如果它从未被借过,我希望它的值为 0——即与借过但 Onloan 为 FALSE 的值相同。

所以如果 bookids 列表是这样的:

"32,77,84"

外借名单应该是这样的

"0,1,1"

其中 1 表示它是外借(out),0 表示它不是外借(in library)。

我需要 onloan 列表具有与 bookids 列表相同数量的元素,因此 to 之间存在 1 对 1 的对应关系,并且我可以最后使用索引重新组装 books 数组。

感谢您的任何建议。

【问题讨论】:

    标签: php mysql left-join


    【解决方案1】:

    试试这个:

    SELECT 
      aid, 
      group_concat(bookid ORDER BY bookid ASC) AS bookids, 
      group_concat(bookname ORDER BY bookid ASC) AS booknames, 
      group_concat(onloan ORDER BY bookid ASC) AS onloan
    FROM (
      SELECT a.id AS aid, b.id AS bookid, b.bookname AS bookname, IF(bo.onloan IS NOT NULL, bo.onloan, 0) AS onloan
      FROM authors a
      LEFT JOIN books b ON b.authorid = a.id
      LEFT JOIN borrowed bo ON bo.bookid = b.id
    ) t
    GROUP BY aid
    

    注意IF。这可以保证您始终获得onloan 的结果。

    【讨论】:

    • 这看起来不错,但由于某种原因,我在字段列表错误中收到未知列 bo.onloan
    • 您介意再次校对您的答案吗?我不断收到一个sql错误。别名 bookids、booknames 是否应该在末尾有一个“s”? FROM 子句末尾的 ) 之后的 t 有什么意义吗?那应该是's'吗?我已经尝试了很多方法,但不断收到错误,最近一次接近(onloan...in line 5
    • 好的,我想我让它工作了,我想,有几个变化,书名后应该有一个逗号,选择子句后应该是 b,而不是 t。谢谢!
    • t 只是 mysql 的一个要求,每个“表”(甚至是子选择)都需要一个名称,但这并不重要。 AS后面的名字你可以随便用,我就用你提供的那个。
    • 你是对的。那个逗号从我身边溜走了。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多