MySQL условный запрос внутри, где предложение - PullRequest
0 голосов
/ 15 июля 2009

Я не уверен, что мне не хватает чего-то действительно очевидного, но я получаю синтаксическую ошибку в этом запросе. Даже если я упускаю что-то очевидное, я хотел бы знать, есть ли более разумный способ получить то, чего я добиваюсь.

По сути, запрос запрашивает любые строки, связанные с пользователем с датой start_date с понедельника по пятницу. Это прекрасно работает. Но затем я добавил условный запрос на случай, если в эту субботу или воскресенье появятся какие-либо строки. Обратите внимание, что условный запрос проверяет ЛЮБЫЕ пользователи с субботой или воскресеньем, а не пользователя в основном запросе:

SELECT user_id,
DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') date, 
TIME_FORMAT(TIME(shift_start), '%h:%i %p') start,
TIME_FORMAT(TIME(shift_end), '%h:%i %p') end,
title   
FROM shifts
WHERE user_id = '$user_id'
AND DATE(shift_start) BETWEEN
DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) AND
DATE_ADD(DATE(NOW()), INTERVAL 
    (SELECT
    IF( 
    COUNT(*) FROM shifts
    WHERE DATE(shift_start) BETWEEN
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY),
6, 4)) - WEEKDAY(NOW()) DAY)
ORDER BY shift_start

Я на самом деле очень горжусь тем, как это работает, прежде чем это испортится с частью IF, но опять же, если есть явно лучший способ сделать это, я весь слух.

О, и когда это будет исправлено, "Now ()" будет заменено переменной даты, установленной в скрипте php (переданной ему через GET).


Отличная работа, бенлумей. Вот что сработало:

SELECT user_id,
       DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') AS shift_start_date, 
       TIME_FORMAT(TIME(shift_start), '%h:%i %p') AS shift_start_time,
       TIME_FORMAT(TIME(shift_end), '%h:%i %p') AS shift_end_time,
       title
FROM shifts
WHERE user_id = '$user_id' AND 
DATE(shift_start) BETWEEN 
    DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) 
    AND 
    DATE_ADD
    (
        DATE(NOW()), INTERVAL
        (
        SELECT IF(COUNT(*),6,4)
        FROM shifts
        WHERE DATE(shift_start) BETWEEN 
            DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) 
            AND 
            DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY)
        ) - WEEKDAY(NOW()) DAY
    )

Ответы [ 2 ]

2 голосов
/ 15 июля 2009

Попробуйте этот подзапрос:

(SELECT 
    IF(COUNT(*) > 0, 6, 4)) - WEEKDAY(NOW()) DAY) 
    FROM shifts 
    WHERE DATE(shift_start) BETWEEN
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY)

Две вещи, которые я сделал

  • сделал так, чтобы это выглядело как обычный запрос, откуда и куда не может идти внутрь, если, насколько я знаю.
  • Поместите условие в if, не думайте, что mysql автоматически примет 0 как false и> 0 как true.
1 голос
/ 15 июля 2009

это разваливается где-то здесь:

    (SELECT
    IF( 
       COUNT(*) FROM shifts
    WHERE DATE(shift_start) BETWEEN

Оператор подсчета не будет работать.

Что ты пытаешься сделать? Вам нужно четкое изложение того, что вы пытаетесь достичь здесь.

Это моя добыча:

 (SELECT
    IF( 
      (select COUNT(*) FROM shifts
       WHERE DATE(shift_start) BETWEEN
       DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
       DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY))>0,6,4)
 ) - WEEKDAY(NOW()) DAY

Но, не зная, что вы пытаетесь сделать, я не уверен.

...