2015-11-12 4 views
0

я получил следующую запись в базе данных:MySQL/PHP: Выберите Где с несколькими условиями не работает

id    date    start_time 
1     2015-12-25   08:00:00 
2     2015-12-30   08:00:00 
3     2015-12-30   09:00:00    

Теперь я просто хочу, чтобы выбрать дату из тех записей, где оба start_time записи 08:00:00 и 09:00:00 существует ,

Я пытался использовать этот SQL-запрос:

$sqlquery = mysqli_query($myconnection,"SELECT date 
             FROM mytable 
             WHERE start_time LIKE '08:00:00' 
             AND '09:00:00'") or die ("crashed"); 

Но он возвращает мне обе даты 2015-12-25 и 2015-12-30. Он должен возвращать только 2015-12-30, потому что на эту дату 08:00:00 и 09:00:00 существует.

Я хочу указать даты, у которых есть запись для 08:00:00 и 09:00:00.

Не следует выбирать даты с только запись для 08:00:00 но ни для 09:00:00, а также не те, которые имеют вход для 09:00:00 но ни для 08:00:00.

+2

Вы хотите только те строки, где 'start_time = '08: 00: 00' OR start_time = '09: 00: 00' 'OR, где время в' start_time' есть что-то МЕЖДУ '08:00:00 и 09: 00: 00' Это может показаться разницей в тонкости, но это не – RiggsFolly

+0

будет всегда одинаковым (т.е. 8:00 и 9:00)? или вам нужно увидеть счетчик времени начала конкретной даты? – davejal

+0

Хорошо, я вижу, мне нужно объяснить более ясно. Я хочу выбрать те даты, у которых есть запись для 08:00:00 и 09:00:00. Он не должен выбирать даты только с записью в 08:00:00, но не для 09:00:00, а также не для тех, у кого есть запись для 09:00:00, но нет для 08:00:00. – coder

ответ

2

Не используйте like для столбцов даты/времени. Вот, вы, кажется, хотите between:

SELECT date 
FROM mytable 
WHERE start_time BETWEEN '08:00:00' AND '09:00:00'; 

Ваш оригинальный препарат обрабатывается следующим образом:

WHERE (start_time LIKE '08:00:00') AND '09:00:00' 

Вторая часть представляет собой строковое значение в булево/целочисленном контексте. Он преобразуется в 9, что всегда верно. Таким образом, предложение where заканчивает тем, что эквивалентно:

WHERE start_time = '08:00:00' 

EDIT:

Ваше разъяснение меняет мое понимание вопроса. Если вы хотите дней, как раз, использовать агрегацию:

SELECT date 
FROM mytable 
WHERE start_time IN ('08:00:00', '09:00:00') 
GROUP BY date 
HAVING COUNT(*) = 2; 
+2

Я думаю, что вы слишком много принимаете, кодируя «МЕЖДУ», поскольку это далеко не очевидно из вопроса. _ (не мой dv) _ – RiggsFolly

+0

Извините, но это не сработает. – coder

+0

@coder. , , Я неправильно истолковал исходный вопрос (мой ответ был разумным догаждением о том, чего вы действительно хотите). Простое объединение с 'HAVING' должно решить вашу проблему. –

0

Как уже упоминалось в комментариях есть различные способы достичь его в зависимости от того, что вы на самом деле хотите сделать с результатом.

  1. Easy-> Просто посчитайте записи с конкретными датами

    select date, count(start_time) 
    from mytable 
    group by date 
    having count(start_time) > 1 
    

2.Advanced-> Отобразить записи с помощью дела

select * 
    from (
      Select date, 
       case when start_time = '08:00:00' then 1 end as startat8, 
       case when start_time = '09:00:00' then 1 end as startat9 
      from mytable 
     ) a 
    where a.startat8=1 and a.startat9=1; 
+0

вариант 1 не будет смотреть на определенное время в таблице, только если есть более 1 записи, а опция 2 будет специально искать 8:00 и 9:00, убедитесь, что время написано в db точно так же, как в в запросе – davejal

+0

произошла ошибка с опцией 1, я обновил ответ – davejal

+0

Прошу прощения, оба варианта не работают. Первый не дает результата, а при запуске второго запускается запрос mysqli. – coder

1

я предполагаю, что вы в основном хотите выбрать дату, которая имеет как '08: 00: 00 ', так и '09: 00: 00', тогда вы не должны использовать «МЕЖДУ». попробовать этот запрос:

SELECT t1.date 
FROM mytable AS t1 
INNER JOIN mytable AS t2 ON t1.date = t2.date 
INNER JOIN mytable AS t3 ON t1.date = t3.date 
INNER JOIN mytable AS t4 ON t1.date = t4.date 
WHERE t1.start_time = '08:00:00' 
    AND t2.start_time = '09:00:00' 
    AND t3.start_time = '10:00:00' 
    AND t4.start_time = '11:00:00' 
GROUP BY t1.date 

или вы можете попробовать другой подход

SELECT t1.date 
FROM mytable AS t1 
GROUP BY t1.date 
HAVING SUM(IF(t1.start_time = '08:00:00', 1, 0)) > 0 
AND SUM(IF(t1.start_time = '09:00:00', 1, 0)) > 0 
AND SUM(IF(t1.start_time = '10:00:00', 1, 0)) > 0 
AND SUM(IF(t1.start_time = '11:00:00', 1, 0)) > 0 
+0

За исключением вы можете использовать '=' вместо 'LIKE' – RiggsFolly

+0

Это работает просто отлично! Спасибо. Не могли бы вы рассказать мне, как будет выглядеть код, если бы у меня было 5 раз, и только те даты, которые все 5 раз были выбраны? Как 08:00:00, 09:00:00, 10:00:00, 11:00:00, 12:00:00 – coder

+0

Это именно то, о чем я предупреждал в вашем вопросе, сейчас 8:00:00 сложно закодировано – davejal

Смежные вопросы