SELECT的性能

问题描述 投票:-1回答:1

我需要一些帮助来执行我的SELECT。我做了一个SQL小提示器来向你展示数据库。

我需要执行两个查询,但它们没有正常工作:

第一:

SELECT  s.id, s.day_of_week, s.title
FROM slots s 
LEFT JOIN bookings_has_slots bhs
ON s.id = bhs.slot_id
LEFT JOIN bookings b
ON bhs.booking_id = b.id

WHERE NOT EXISTS (
  SELECT    null
  FROM  bookings_has_slots bhs2
  LEFT JOIN bookings b2
  ON        bhs2.booking_id = b2.id
  WHERE     b.date = '2018-01-27'
)
AND s.service_id = 3
AND s.day_of_week = DAYOFWEEK('2018-01-27');

返回:

id  day_of_week title
3   7           Après-midi (14h30 - 17h00)

但我希望:没有结果,因为在同一天这个day_of_week的三个插槽可能性。

第二:

SELECT DISTINCT b3.date AS unavailable_date
FROM bookings b3
LEFT JOIN bookings_has_slots bhs3
ON bhs3.booking_id = b3.id
LEFT JOIN slots s3
ON s3.id = bhs3.slot_id
WHERE NOT EXISTS (
  SELECT    null
  FROM slots s 
  LEFT JOIN bookings_has_slots bhs
  ON s.id = bhs.slot_id
  LEFT JOIN bookings b
  ON bhs.booking_id = b.id

  WHERE NOT EXISTS (
    SELECT  null
    FROM    bookings_has_slots bhs2
    LEFT JOIN bookings b2   
    ON      bhs2.booking_id = b2.id
    WHERE   b.date = b2.date
  )
  AND s.service_id = 3
  AND s.day_of_week = s3.day_of_week
);

返回:

unavailable_date
2018-01-17
2018-01-31
2018-01-27
2018-02-03

但我希望:

unavailable_date
2018-01-17
2018-01-31
2018-01-27

因为在这里,还有另外两个可用于“2018-02-03”的插槽,而其他任何预订都没有使用。

这是sql小提琴:

http://sqlfiddle.com/#!9/89e46/9

谢谢你的帮助。

mysql sql select join
1个回答
0
投票

这还不是答案。

但是你能否证实这将解决你的第一个问题:

SELECT  s.id, s.day_of_week, s.title
FROM slots s 
LEFT JOIN (
  SELECT slot_id, booking_id
  FROM bookings_has_slots bhs
  INNER JOIN bookings b
  ON b.id = bhs.booking_id
    AND b.date = '2018-02-03'
  ) bhs
ON s.id = bhs.slot_id
WHERE s.day_of_week = DAYOFWEEK('2018-02-03')
  AND bhs.booking_id IS NULL;

第二个查询:

http://sqlfiddle.com/#!9/53a998/1

SELECT d.date unavailable_date, d.used_slots
FROM (
  SELECT b.date, COUNT(b.id) used_slots
  FROM bookings b
  GROUP BY b.date
  ) d
LEFT JOIN slots s 
ON  s.day_of_week = DAYOFWEEK(d.date)
GROUP BY d.date
HAVING d.used_slots = COUNT(s.id);
© www.soinside.com 2019 - 2024. All rights reserved.