簡體   English   中英

MYSQL從多個表中多次選擇

[英]MYSQL multiple select from multiple tables

我有X個表,我想要一個查詢來獲取我想要的所有數據。 我想要這種方法的原因是我的數據庫中有10.000條以上的記錄,所以我只能使用1條查詢,因為如果我使用3-4條查詢,並且獲取10條數據,那么執行該命令將花費很長時間。服務器。

因此表:

** book_info **    
bookId   status        title
------   ------        -----
101      available     How to cook
102      available     IT tips and tricks
103      unavailable   How to use your calc
etc...


** book_writers **    
bookId   writer
------   ------
101      Tom
102      Mike
103      Mike
etc...


** book_log **    
bookId   action   client   date
------   ------   ------   ----
103      loan     Fred     2017-6-10
102      loan     Anna     2017-6-8
101      return   Anita    2017-5-3
101      loan     Anita    2017-2-2
etc...

而我只需要一個查詢:

bookId   status      title                writer   lastLoan   lastReturn
------   ------      -----                ------   --------   ----------
101      available   How to cook          Tom      2017-2-2   2017-5-3
102      available   IT tips and tricks   Mike     2017-6-8   -
etc...

我通過使用JOIN和UNION進行了嘗試,但是我做不到。


UPDATE

因此,由於我從你們那里得到了很好的解決方案,所以我終於建立了我所尋找的查詢。 但是我不能做的一件事是在“子級”聯接查詢中使用“父級”查詢變量。

因此,我有一個包含書籍內容的表格:

** book_content **    
bookId   content
------   -------
101      Lorem ipsum dolor sit amet, consectetur...
102      Donec ut lacus non odio blandit molestie
103      Interdum et malesuada fames ac ante ipsum...
etc...

我試圖像查詢

select
  bi.bookId
  bd.content
from
  books_info as bi
left outer join
(
  select
    bookId
    content
  from
    book_content
  where
    bookId = bi.bookId
) bd on bi.bookId = bd.bookId

但是SQL表示#1054 - Unknown column 'bi.bookId' in 'where clause'中的#1054 - Unknown column 'bi.bookId' in 'where clause' 如何在子bi.bookId查詢中使用bi.bookId

您可以使用兩次內部book_log進行內部聯接和左聯接

select i.bookId, i.status, i.title, w.writer, max(l1.date) lastLoan,  max(l2.date) lastReturn
from book_info as i
inner join book_writers w on i.bookId = w.bookId
inner join book_log l1 on i.book_id = l1.book_id and l1.action ='load'
left join  book_log l2 on i.book_id = l2.book_id and l2.action ='return'
group by i.bookId, i.status, i.title

和(如Tuncay在下面的評論中建議的那樣)

如果有多個授權,請使用group_concat

select i.bookId, i.status, i.title, group_concat(w.writer), max(l1.date) lastLoan,  max(l2.date) lastReturn
from book_info as i
inner join book_writers w on i.bookId = w.bookId
inner join book_log l1 on i.book_id = l1.book_id and l1.action ='load'
left join  book_log l2 on i.book_id = l2.book_id and l2.action ='return'
group by i.bookId, i.status, i.title

嘗試此查詢,希望它能工作。

SELECT bi.bookId,status,title,writer,bl.lastLoan,
           bl.lastReturn,bl.totalLoan,bl.totalReturn
from book_info bi
left outer join book_writers as bw on bi.bookId = bw.bookId
left outer join(
SELECT 
bookId,
COUNT(CASE WHEN action = 'loan' THEN action END) AS totalLoan,
COUNT(CASE WHEN action = 'return' THEN action END) AS totalReturn,
 CASE
        WHEN action = 'loan' THEN date
END AS lastLoan,
    MAX(CASE
        WHEN action = 'return' THEN date
END) AS lastReturn

FROM book_log
group by bookId

)  bl on bi.bookId = bl.bookId
group by bi.bookId

如果您有書籍內容,則將顯示,否則將顯示null。

select
  bi.bookId
  bd.content
from
  books_info as bi
left join book_content as bd on bi.bookId = bd.bookId
group by bi.bookId

在此處輸入圖片說明

編輯:增加了第二查詢書的內容。

這是我的看法。 與scaisEdge基本相同,但更加詳細。 為此創建了一個sqlfiddle

select
  i.`bookId`,
  i.`status`,
  i.`title`,
  group_concat(w.`writer`) as writers,
  coalesce(max(ll.`date`), '') as lastLoan,
  coalesce(max(lr.`date`), '') as lastReturn
from
  book_info i
left join
  book_writers w on w.bookId=i.bookId
left join
  book_log ll on (ll.bookId=i.bookId) and (ll.`action`='loan')
left join
  book_log lr on (lr.bookId=i.bookId) and (lr.`action`='return') and (lr.`date` >= ll.`date`)
group by
  w.bookId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM