我如何编写一个 SQL 查询左连接 2 tables 列出左侧 table 的所有条目,但只列出一次?

How can I write a SQL query left joining 2 tables that lists all entries on the left table, but only once?

我的问题有点复杂,所以我不确定我在标题中总结得很好,但它是这样的--

我有两个 table:一个 BOOKDETAIL table 包含很多书籍的数据,一个 STOCKDIARY table 包含我们之前订购的书籍的销售历史。并非 BOOKDETAIL table 中的每一本书在 STOCKDIARY 中都有记录。我想列出 BOOKDETAIL table 中的每一本书,并首先按最近售出的那些排序,然后按字母顺序排列其他所有内容。这就是我让它工作的范围:

SELECT BOOKDETAIL.*, STOCKDIARY.DATENEW, STOCKDIARY.PRODUCT
FROM BOOKDETAIL
LEFT JOIN STOCKDIARY
ON BOOKDETAIL.ISBN = STOCKDIARY.PRODUCT
ORDER BY STOCKDIARY.DATENEW DESC, bookdetail.Title ASC

这确实列出了每本书,但如果这本书已售出多次,则该书将在列表中出现多次。我希望每本书只出现一次!

我尝试添加这个 WHERE 子句:

WHERE STOCKDIARY.DATENEW IN (
SELECT MAX(DATENEW) AS DATENEW
FROM STOCKDIARY
GROUP BY PRODUCT)

但后来我只看到在 STOCKDIARY 中有条目的书。我怎样才能让它工作,以便每本书只出现一次?

将您的第二个查询(where 子句)更改为:

WHERE STOCKDIARY.DATENEW = (
SELECT MAX(s.DATENEW)
FROM STOCKDIARY s 
Where s.PRODUCT=BOOKDETAIL.ISBN)

这将只返回每本书在 stockdiary 上的最新记录。因为它在 on 子句而不是 where 子句中,所以它还会显示存在于 bookdetail 但不存在于 stockdiary.

上的记录

order by 中的 case 语句将根本未购买的书籍放在底部而不是顶部。 Mysql 没有 nulls last.

select b.*, s.last_sold, s.product
  from bookdetail b
  left join (select product, max(datenew) as last_sold
               from stockdiary
              group by product) s
    on b.isbn = s.product
 order by case when s.last_sold is null
               then '1900-01-01' else s.last_sold end desc,
          b.title