Как сравнить имя поля двух таблиц с другим значением в MySQL? - PullRequest
1 голос
/ 04 февраля 2010

У меня есть две таблицы

  1. table_school

    school_open_time|school_close_time|school_day
    8:00 AM         | 9:00PM          | Monday
    10:00 AM        | 7:00PM          | Wednesday
    
  2. table_college

     college_open_time|college_close_time|college_day    
     10:00 AM         | 8:00PM           | Monday
     10:00 AM         | 9:00PM           | Tuesday
     10:00 AM         | 5:00PM           | Wednesday
    

Теперь я хочу выбрать school_open_time school_close time, college_open_time и college_close_time в соответствии с сегодняшним днем ​​(означает college_day=school_day=today), а также, если в какой-либо одной таблице нет строки для определенного дня, тогда отобразить пустое поле (LEFT JOIN, думаю, что смогу использовать).

Пожалуйста, предложите мне лучший и оптимизированный запрос для этого.

UPDATE:

если для школы нет открытого и закрытого времени, то должны быть возвращены College_open_time и College_close_time (не заполняются в базе данных, просто возвращаются) как school_open_time и school_close_time. и всегда должно быть College_open_time и College_close_time для данного дня


я использую запрос ниже

 SELECT college_open_time,college_close_time ,school_open_time,
        school_close_time  FROM tbl_college
 LEFT JOIN tbl_school ON school_owner_id=college_owner_id 
 WHERE college_owner_id='".$_session['user_id']."' AND
 college_day='".date('l',time())."'";

он возвращает одну строку (левая рука имеет некоторое значение, а правая рука имеет пустое значение), когда в таблице table_school нет строки данного дня, НО отображает семь строк с одинаковым значением в левой части (college_open_time, College_close_time) и 6 пустая строка справа (school_open_time и school_close_time)

i need only one row when both table have a row of a given day

, но используя приведенный выше запрос, возьмите только первую строку соответствующей table_school, где school_owner_id равен 50 (let), при этом не видно условия, что имя school_day должно быть присвоено day


Подробнее ОБНОВЛЕНИЕ @ 37 звезд

Есть небольшая проблема, дорогая, тип данных school_close_time и school_open time TIME тогда как тип данных College_open_time и College_close_time имеет тип VARCHAR. Я использовал приведенный ниже код, но я немного изменил его и приближаюсь к результату,

но теперь скажите мне, где я должен написать IFNULL в следующем фрагменте кода

IFNULL (TIME_FORMAT ()) или TIME_FORMAT (IFNULL ())

SELECT TC.owner_id,college_open_time AS collegeOpen, 
       college_close_time AS collegeClose, 
TIME_FORMAT(school_open_time, '%h:%i %p' ) AS schoolOpen,       
TIME_FORMAT(school_close_time, '%h:%i %p' ) AS schoolClose
FROM tbl_college TC
LEFT JOIN tbl_school  TS ON TS.owner_id = TC.owner_id
AND TC.college_day = TS.school_day
WHERE college_day = DATE_FORMAT(NOW(),'%W')

Решение

Спасибо 37stars, ты, гениальный, спасибо за идею IFNULL,

я пишу ОПТИМАЛЬНЫЕ И ЛУЧШИЕ ЗАПРОСЫ

SELECT TC.owner_id,college_open_time AS collegeOpen,college_close_time AS 
    collegeClose, IFNULL(TIME_FORMAT(school_open_time, '%h:%i %p'),college_open_time) 
    AS schoolOpen,IFNULL(TIME_FORMAT(school_close_time, '%h:%i %p',college_close_time)
    AS schoolClose FROM tbl_college TC LEFT JOIN tbl_school TS 
    ON TS.owner_id = TC.owner_id AND TC.college_day = TS.school_day 
    WHERE college_day = DATE_FORMAT(NOW(),'%W') 
    FROM tbl_storecalendar TS LEFT JOIN tbl_delivery_hours TD 
    ON TD.store_id = TS.store_id 
    AND TD.del_day = TS.dayName WHERE dayName = DATE_FORMAT( NOW( ) , '%W' )

Ответы [ 4 ]

4 голосов
/ 04 февраля 2010

Вы хотите FULL OUTER JOIN, но, к сожалению, MySQL не поддерживает это. К счастью, существует обходной путь, объединяющий левое соединение и правое соединение, используя UNION ALL:

Обновление: изменен запрос для ответа на обновленный вопрос OP.

SELECT
    COALESCE(school_day, college_day) AS day,
    COALESCE(school_open_time, college_open_time) AS school_open_time,
    COALESCE(school_close_time, college_close_time) AS school_close_time,
    COALESCE(college_open_time, school_open_time) AS college_open_time,
    COALESCE(college_close_time, school_close_time) AS college_close_time
FROM (
    SELECT * FROM table_school LEFT JOIN table_college ON school_day = college_day
    UNION ALL
    SELECT * FROM table_school RIGHT JOIN table_college ON school_day = college_day
    WHERE school_day IS NULL
) AS T1
1 голос
/ 09 марта 2010

Вам нужно добавить school_day = College_day к вашему предложению JOIN.

SELECT college_open_time, college_close_time, school_open_time, school_close_time
FROM dbo.tbl_college AS TC
    LEFT JOIN dbo.tbl_school AS TS ON TS.owner_id = TC.owner_id 
    AND TS.school_day = TC.college_day
WHERE TC.owner_id = 1 
    AND college_day = 'tuesday'
1 голос
/ 04 февраля 2010

Если вы хотите выполнить это в одном запросе, вам придется использовать UNION, чтобы собрать результаты вместе, например:

SELECT school_open_time AS openTime,`int` AS school_close_time
    FROM table_school WHERE school_day=DATE_FORMAT(NOW(),'%W')
UNION
SELECT college_open_time AS openTime,`int` AS college_close_time
    FROM table_college WHERE college_day=DATE_FORMAT(NOW(),'%W');

Где DATE_FORMAT(NOW(),'%W') конвертируется в текущий день недели.

Однако этот метод не кажется мне таким уж замечательным. Прежде всего, он не будет обрабатывать помещение методов NULL в набор результатов для вас в случае пропущенной записи. Вы можете добавить некоторые операторы IF / ELSE, чтобы сделать это для вас, но, честно говоря, я бы просто сделал два отдельных запроса из вашего кода PHP. Таким образом, вы можете обращаться с каждым по отдельности и более легко контролировать свои результаты.

1 голос
/ 04 февраля 2010

Я бы порекомендовал изменить структуру вашей БД на две таблицы со следующей структурой:

table institutions:<br> institution | institution_id<br> table times:<br> institution_id | day | open_time | close_time<br>

Вы можете легко поместить две существующие таблицы в новую таблицу времени, т.е.
INSERT INTO times(institution, day, open_time, close_time)<br> SELECT 'School', school_day, school_open_time, school_close_time<br> FROM table_school<br>

А затем получить результаты запроса легко:
SELECT i.institution, t.open_time, t.close_time<br> FROM times t<br> LEFT JOIN institutions i on t.institution_id=i.institution_id<br> WHERE day='Wednesday'<br>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...