2016-08-22 330 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 

注:我想3个分开的单个查询,以得到上面的输出

在由于推进

+1

问题是什么? – sagi

+0

请阅读完整的文章,我已经提到了3个预期的输出和查询要修改@sagi –

+0

sathvik能否请你扩展你的问题 –

回答

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()'来订购,因此它将始终是相同的订单,你不必同时看到'男性,女性'和'女性,男性'。看看我的句子,你可以将它添加到内部查询中,添加到having子句'HAVING MAX(gender)='female'' for female female,'HAVING MIN(gender)='man'' for men。和'具有计数(DISTINCT GENDER)= 2'。 – sagi

+0

是的,我已经在我的代码@sagi中进行了优化。谢谢,我已经回答了,因为其他人会从中得到一些想法。无论如何,我也会在这里编辑。 –

+0

我认为'HAVING MAX(gender)='female''这在某些情况下不起作用 –

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

@sagi是的,我认为你是对的 - 所以这是必要的 – Strawberry