所以我无法在标题中准确表达我的需求。我是mysql的新手 首先,这是我当前正在使用http://dl.dropbox.com/u/37057843/P2_Scripts.sql
的sql表我将简要解释一下:我需要在一家酒店中多次获得客户,并且每个类型的房间至少需要一次。 (查看下表的说明)
这些是表格:
基本上,
正如我之前提到的,我需要让每个类型的房间至少有一次客户,所以基本上一次或多次在单独的房间和一次或多次在双人房。
我知道这有点不好解释,但我不知道如何更好地解释它,对不起。
我现在正在使用此查询来获取个别房间内的人(姓名,姓氏和房间号)
SELECT c.nombre, c.apellidos, r.idHabita
FROM clientes c, reservas r, precios p, habitaciones h
WHERE r.idCliente = c.id
AND r.idHabita = h.id
AND h.idPrecio = p.id
AND p.tipo LIKE 'individual'
而且我知道我必须做某种类型的子查询来检查p.tipo是否也是'double',但我不知道它是否正常工作。 此查询返回的客户端也与双人房中的客户端相同。事实上,这些是个别房间里唯一的。但我需要一个查询来检查他们是否也在双人房。
提前感谢您阅读!
答案 0 :(得分:2)
要让客户“在每种类型的房间中至少一次”,请加入客户关系表及其关联的预订并按客户对结果进行分组 - 然后您需要那些拥有房间类型表中的房间类型数量相同,可以用HAVING
子句表示:
SELECT c.*
FROM clientes c
JOIN reservas r ON r.idCliente = c.id
JOIN habitaciones h ON r.idHabita = h.id
JOIN precios p ON h.idPrecio = p.id
GROUP BY c.id
HAVING COUNT(DISTINCT p.tipo) = (
SELECT COUNT(DISTINCT tipo) FROM precios
)
在sqlfiddle上查看。
答案 1 :(得分:0)
这显示了符合条件的每个房间的行数(每人多个房间 - 至少一个人和至少一个人) - 正是您请求的输出(顺便说一下,当他们帮助您时接受答案,或者人们将停止帮助你):
SELECT c.nombre, c.apellidos, r.idHabita
FROM clientes c
INNER JOIN reservas r
ON r.idCliente = c.id
INNER JOIN habitaciones h
ON r.idHabita = h.id
WHERE r.idCliente IN
(SELECT r1.idCliente
FROM clientes c1
INNER JOIN reservas r1
ON r1.idCliente = c1.id
INNER JOIN habitaciones h1
ON r1.idHabita = h1.id
INNER JOIN precios p1
ON h1.idPrecio = p1.id
WHERE p1.tipo = 'individual')
AND r.idCliente IN
(SELECT r2.idCliente
FROM clientes c2
INNER JOIN reservas r2
ON r2.idCliente = c2.id
INNER JOIN habitaciones h2
ON r2.idHabita = h2.id
INNER JOIN precios p2
ON h2.idPrecio = p2.id
WHERE p2.tipo = 'doble')
ORDER BY c.nombre, c.apellidos, r.idHabita
更新:刚刚添加了排序...