2016-08-22 24 views
2

から複数の列によってグループが私はそうMySQLの - 同じテーブル

に...次

sno | booking_id | room_type | gender | age | amount | days 
1 | 2016JUL001 | AC  | Male | 25 | 1000 | 15 
2 | 2016JUL001 | AC  | Male | 42 | 1000 | 15 
3 | 2016JUL001 | AC  | Male | 28 | 1000 | 15 
4 | 2016JUL010 | N AC  | Female | 45 | 1000 | 15 
5 | 2016JUL010 | N AC  | Female | 46 | 1000 | 15 
6 | 2016JUL005 | N AC  | Male | 28 | 1000 | 15 
7 | 2016JUL005 | N AC  | Female | 35 | 1000 | 15 
8 | 2016JUL009 | AC  | Female | 26 | 1000 | 15 
9 | 2016JUL009 | AC  | Female | 25 | 1000 | 15 

のような表を持って

の予想される出力[私は性別を取得したい場合=「女性」]

sno | booking_id | room_type | gender | age | amount | days 
4 | 2016JUL010 | N AC  | Female | 45 | 1000 | 15 
5 | 2016JUL010 | N AC  | Female | 46 | 1000 | 15 
8 | 2016JUL009 | AC  | Female | 26 | 1000 | 15 
9 | 2016JUL009 | AC  | Female | 25 | 1000 | 15 

の予想される出力

sno | booking_id | room_type | gender | age | amount | days 
1 | 2016JUL001 | AC  | Male | 25 | 1000 | 15 
2 | 2016JUL001 | AC  | Male | 42 | 1000 | 15 
3 | 2016JUL001 | AC  | Male | 28 | 1000 | 15 
[私は= 'マーレ性別を取得したい場合]

期待出力

sno | booking_id | room_type | gender | age | amount | days 
6 | 2016JUL005 | N AC  | Male | 28 | 1000 | 15 
7 | 2016JUL005 | N AC  | Female | 35 | 1000 | 15 

NOTE [私は性別=「男」AND性別=「女性」を取得したい場合]:私は3つの別々の個々のクエリは、上記の出力にで

感謝を取得したいです

+1

質問は何ですか? – sagi

+0

完全な投稿を読んでください、私は3つの期待される出力とクエリが変更されることを述べました@サギ –

+0

sathvikはあなたの質問をexpineしてくださいできます –

答えて

0

だ、私は

クエリ[ '女性']

SELECT sno, bd.booking_id, bd.room_type, bd.gender, bd.age 
FROM customer_data bd 
INNER JOIN ( 
    SELECT booking_id, GROUP_CONCAT(DISTINCT gender) AS g 
    FROM customer_data 
    WHERE gender!='' AND age>0 
    GROUP BY booking_id 
    HAVING COUNT(booking_id) > 1 
    ORDER BY booking_id ASC, gender DESC 
) cbd 
WHERE cbd.booking_id = bd.booking_id AND cbd.g = 'Female' 

は、クエリ[必要なデータを取得することができています'男']

SELECT sno, bd.booking_id, bd.room_type, bd.gender, bd.age 
FROM customer_data bd 
INNER JOIN ( 
    SELECT booking_id, GROUP_CONCAT(DISTINCT gender) AS g 
    FROM customer_data 
    WHERE gender!='' AND age>0 
    GROUP BY booking_id 
    HAVING COUNT(booking_id) > 1 
    ORDER BY booking_id ASC, gender DESC 
) cbd 
WHERE cbd.booking_id = bd.booking_id AND cbd.g ='Male' 

クエリ[ '男と女']

SELECT sno, bd.booking_id, bd.room_type, bd.gender, bd.age 
FROM customer_data bd 
INNER JOIN ( 
    SELECT booking_id, GROUP_CONCAT(DISTINCT gender ORDER BY gender DESC) AS g 
    FROM customer_data 
    WHERE gender!='' AND age>0 
    GROUP BY booking_id 
    HAVING COUNT(booking_id) > 1 
    ORDER BY booking_id ASC, gender DESC 
) cbd 
WHERE cbd.booking_id = bd.booking_id AND cbd.g = 'Male,Female' 
+1

非常に非効率的に見えます。 A)完璧なマッチを探すときは 'LIKE'を' = 'に置き換えてください。 B)あなたは 'GROUP_CONCAT()'で注文することができますので、常に同じ順序になり、 'Male、Female'と' Female、Male'の両方を見る必要はありません。私の持っている句を見てみましょう。内側のクエリに追加することができます。女性には 'MAX(性別)= '女性'、メンズには' MIN(性別)= '男性'という条件節に追加できます。両方のために「カウント(DISTINCT GENDER)= 2」を持つ。 – sagi

+0

ええ、私はすでに@sagiのコードで最適化しました。ありがとう、私はいくつかの他の人がこれからいくつかのアイデアを得るため、答えました。とにかくここでも編集します。 –

+0

私は '最大値(性別)= '女性'だと思うが、これはうまくいきません。 –

3

まずクエリを進める:

SELECT sno, booking_id, room_type, gender, age 
FROM customer_data 
WHERE booking_id IN (SELECT booking_id FROM customer_data 
         WHERE gender='female' AND age>0 and RIGHT(booking_id,1) <> '1' 
         GROUP BY booking_id HAVING COUNT(*) > 1) 
ORDER BY booking_id ASC, age ASC 

第二:

SELECT sno, booking_id, room_type, gender, age 
FROM customer_data 
WHERE booking_id IN (SELECT booking_id FROM customer_data 
         WHERE gender='male' AND age>0 
         GROUP BY booking_id HAVING COUNT(*) > 1) 
ORDER BY booking_id ASC, age ASC 

そして第三に:

SELECT sno, booking_id, room_type, gender, age 
FROM customer_data 
WHERE booking_id IN (SELECT booking_id FROM customer_data 
         WHERE gender IN('male','female') AND age>0 
         GROUP BY booking_id HAVING COUNT(distinct gender) = 2) 
ORDER BY booking_id ASC, age ASC 

最初の二つであなただけの1性別を持っているだけbooking_idを望んでいた場合は、having句に追加します。

AND COUNT(distinct gender) = 1 
+0

予約IDは私が言及したものと同じではありません..変更されます –

+0

どのように変更されますか?どうしましたか?あなたは私があなたが必要とするものを推測することを期待していますか? – sagi

+0

ありがとうございます。 @Manishsharma – sagi

0

あなたのスキーマがやや不備表示されます。それにもかかわらず、ここにしようと多くの後に考えることを何か...

SELECT booking_id 
    , COUNT(DISTINCT gender) x 
    FROM customer_data 
WHERE gender IN ('Male','Female') <-- not strictly necessary if there are only two genders. 
GROUP 
    BY booking_id; 
+0

彼の質問では、ジェンダーのための空の文字列値もあると仮定します。 – sagi

+0

@サギはい、私はあなたが正しいと思います - したがって、この例では必要です – Strawberry

関連する問題