检查客户端是否在表中出现多次

时间:2012-06-05 18:06:16

标签: mysql

所以我无法在标题中准确表达我的需求。我是mysql的新手 首先,这是我当前正在使用http://dl.dropbox.com/u/37057843/P2_Scripts.sql

的sql表

我将简要解释一下:我需要在一家酒店中多次获得客户,并且每个类型的房间至少需要一次。 (查看下表的说明)

这些是表格:

  • 预约(预订),包含预订的ID(id),预留的客户ID(idCliente)和房间号(idHabita)。
  • 客户,包含他的身份证的客户表,他的姓名(nombre),他的姓(apellido),他的地址和电话号码(最后两个未使用)
  • habitaciones(rooms),其中包含房间号(id),大小为m2(superficie),有几件无关紧要,最后是价格的id(idPrecio)。
  • precios(价格),包含条目的ID,房间的类型(tipo)和价格(precio)。 TIPO的价值可以是“个人”或“双倍”。喜欢个人或双人房。

基本上,

  • reservas.idCliente = clientes.id
  • reservas.idHabita = habitaciones.id
  • habitaciones.precio = precio.id

正如我之前提到的,我需要让每个类型的房间至少有一次客户,所以基本上一次或多次在单独的房间和一次或多次在双人房。

我知道这有点不好解释,但我不知道如何更好地解释它,对不起。

我现在正在使用此查询来获取个别房间内的人(姓名,姓氏和房间号)

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',但我不知道它是否正常工作。 此查询返回的客户端也与双人房中的客户端相同。事实上,这些是个别房间里唯一的。但我需要一个查询来检查他们是否也在双人房。

提前感谢您阅读!

2 个答案:

答案 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

更新:刚刚添加了排序...