Как я узнаю, какое значение в диапазоне «ударил» при выборе с левым соединением? - PullRequest
0 голосов
/ 07 марта 2012

Если у меня есть этот (MySQL) оператор:

   SELECT h.*
     FROM houses h 
LEFT JOIN avail a ON (h.id = a.house_id
                 AND (    a.date_occupied = '2012-03-07'
                       OR a.date_occupied = '2012-03-08'
                       OR a.date_occupied = '2012-03-09'
                       OR a.date_occupied = '2012-03-10'))
    WHERE sleeps_count >= '1'
      AND active = 1
      AND a.house_id IS NULL
ORDER BY h.name

Есть ли способ получить 'date_occupied', который соответствует возвращенным в результатах?Или я должен вручную просмотреть результаты, а затем выяснить, какая дата на самом деле та, которая попала?

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Во-первых, это может быть просто:

a.date_occupied IN ('2012-03-07', '2012-03-08', '2012-03-09', '2012-03-10')

Или:

a.date_occupied BETWEEN '2012-03-07' AND '2012-03-10'

И чтобы определить, какая дата была совпадением , просто изучите a.date_occupied. Поскольку уже известно, что он находится в надлежащем диапазоне в силу условия JOIN, вы можете просто включить его в свой список SELECT.

1 голос
/ 07 марта 2012

Вы должны просто добавить столбец date_occupied в список выбора:

   SELECT h.*, a.date_occupied
     FROM houses h 
LEFT JOIN avail a ON (h.id = a.house_id
                 AND (    a.date_occupied = '2012-03-07'
                       OR a.date_occupied = '2012-03-08'
                       OR a.date_occupied = '2012-03-09'
                       OR a.date_occupied = '2012-03-10'))
    WHERE sleeps_count >= '1'
      AND active = 1
      AND a.house_id IS NULL
ORDER BY h.name
1 голос
/ 07 марта 2012

Просто добавьте этот столбец в список SELECT:

SELECT h.*, a.date_occupied
     FROM houses h 
LEFT JOIN avail a

Обновление: , как указывает Гуффа в комментариях, ваш запрос исключает все строки, которые соответствуют критериям объединения. Сначала я это пропустил. Чтобы вернуть информацию (такую ​​как date_occupied) о avail записях, которые связаны с house записями по различным критериям, вам потребуется другое объединение, чтобы раскрыть это данные:

SELECT h.*, b.date_occupied
     FROM houses h 
LEFT JOIN avail a ON (h.id = a.house_id
                 AND (    a.date_occupied = '2012-03-07'
                       OR a.date_occupied = '2012-03-08'
                       OR a.date_occupied = '2012-03-09'
                       OR a.date_occupied = '2012-03-10'))
LEFT JOIN avail b ON h.id = b.house_id
    WHERE sleeps_count >= '1' -- These columns may need to be qualified 
      AND active = 1          -- if they're on the avail table
      AND a.house_id IS NULL
ORDER BY h.name

Или, если вы ищете информацию из avail записей, но просто хотите исключить записи с этими date_occupied значениями, было бы намного проще добавить это ограничение после объединения (т. Е. В предложении WHERE! )

SELECT h.*, a.date_occupied
     FROM houses h 
LEFT JOIN avail a ON h.id = a.house_id
    WHERE sleeps_count >= '1'
      AND active = 1
      AND a.date_occupied NOT IN ('2012-03-07','2012-03-08','2012-03-09','2012-03-10')
ORDER BY h.name

Если ничего из этого не достаточно, то, боюсь, я в корне неправильно понял, что вы просите - и вопрос, возможно, нуждается в разъяснении. :)

0 голосов
/ 07 марта 2012

Если вы хотите узнать, какие даты совпадают, вам нужно удалить это из предложения WHERE, поскольку в настоящее время это приводит к тому, что строки с совпадающими датами исключаются из результирующего набора:

  AND a.house_id IS NULL

Как только вы это сделаете, вы можете добавить столбец a.date_occupied в предложение select, чтобы увидеть, какие даты (если они есть) совпадают. Если даты не совпадают, этот столбец будет НЕДЕЙСТВИТЕЛЕН. Поскольку могут совпадать несколько дат, я рекомендую группировать по h.id и использовать GROUP_CONCAT(), чтобы объединить все данные в одну строку.

Вот последний запрос:

   SELECT h.*, group_concat(distinct a.date_occupied order by a.date_occupied)
     FROM houses h 
LEFT JOIN avail a ON (h.id = a.house_id
                 AND (    a.date_occupied = '2012-03-07'
                       OR a.date_occupied = '2012-03-08'
                       OR a.date_occupied = '2012-03-09'
                       OR a.date_occupied = '2012-03-10'))
    WHERE sleeps_count >= '1'
      AND active = 1
GROUP BY h.id
ORDER BY h.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...