2011-09-14 20 views
-1

私は予約と呼ばれる人々がサインアップできるリストの日付リストを持っています。MySQL - Count/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 

私がしたいのは、予約に基づいてオープンなリストのみを返すクエリです。それは予約と2

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

の容量すべてのヘルプは高く評価されていないので

クエリのみID = 3でリストを返します。

答えて

0

*私自身、私が参加し、その後数えるだろう:

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

私はそれをテストしていませんが、それが一般的な考え方ですが!

+0

@StevieG - 編集のためにありがとう!また誰でも落札した人からのコメントを歓迎します。 –

+0

probsはありません。私はあなたにdownvoteをしませんでしたが、あなたの答えにいくつかの問題があります。 1.リスティングの詳細の代わりにカウントを返します。 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

解決に感謝します。好奇心からちょうど最大を使う理由は? – user162941

+0

すべてのフィールドはlisting.idでグループ化されているため、他の値にアクセスするには集計が必要です。グループのキャパシティ(ID別)は1つだけです。 –

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

これは動作しますが、サブクエリは行数と同じ回数だけ実行されます。 –

+0

で、重要なパフォーマンスヒットではない、bookings.listing_idのインデックスを使用してください。 –

関連する問題