2011-09-14 58 views
-1

我有一個叫做列表的日期列表,人們可以註冊參加一個叫做預訂的部分。MySQL - Where/Having Count> columnName

listings 
id | date | capacity 
1 2010-01-01 3 
2 2010-01-02 1 
3 2010-02-02 2 

bookings 
id | listing_id | name 
1 1   Chris 
2 1   Steve 
3 1   Allen 
4 2   Tracy 

我想要做的是有一個查詢只返回基於預訂的公開列表。

查詢將只使用id = 3.回到上市,因爲它沒有預訂和任何幫助表示讚賞2.

Sample query which won't work: 
SELECT 
    * 
FROM 
    listings 
HAVING COUNT(
      SELECT * FROM bookings WHERE listings.id=bookings.listing_id 
      ) < capacity 

能力。

回答

0

*我自己,我會做一個連接,然後數:

SELECT COUNT(*) as count 
FROM listings, bookings 
WHERE listings.id=bookings.listing_id 
AND count < listings.capacity 
GROUP by listings.id 

我沒有測試過,但是這是一般的想法!

+0

@StevieG - 感謝編輯!也歡迎來自誰downvoted的評論。 –

+0

沒有probs。我沒有讓你失望,但你的答案有幾個問題。它返回一個計數而不是列表詳細信息。 2.加入會排除沒有預訂的列表。 3.我不認爲你可以在這樣的where子句中使用別名'count',應該計數(*),或者再次更好,請使用HAVING – StevieG

+0

好的反饋,謝謝。 –

1
SELECT 
    listings.id, 
    max(listings.date), 
    max(listings.capacity) 
FROM listings 
left join bookings on listings.id = bookings.listing_id 
group by listings.id 
having COUNT(bookings.listing_id) < max(listings.capacity) 
+0

感謝您的解決方案。出於好奇,爲什麼要用max? – user162941

+0

因爲所有字段都按列表.id分組,所以您需要聚合來訪問其他值。集團的能力只有一個值(通過id)。 –

2
SELECT * 
FROM listings 
WHERE capacity > (SELECT count(*) 
        FROM bookings 
        WHERE listings.id=bookings.listing_id) 
+0

這將工作,但子查詢將運行的次數與行數一樣多。 –

+0

,其中bookings.listing_id的索引不應該是重大的性能影響。 –

相關問題