Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > LEFT JOIN


Автор: lumentek 21.4.2010, 12:56
Есть запрос
Код

SELECT
    count(*)
FROM
    lab_analyses
LEFT JOIN
    lpu ON lpu.lpu_id = lab_analyses.lpu_id
WHERE
    lab_analyses.`data` BETWEEN '2010-01-01' AND '2010-04-31'
    AND lab_analyses.`id_type_research` = 15
GROUP BY
    lpu.lpu_id 
ORDER BY 
    lpu.name_lpu 


Таблица lpu - Это справочник. Так вот у меня 1 вопрос.

1. Запрос подсчитывает общее количество проведеных анализов  у для каждого лпу, но только те ЛПУ которые, id которых есть в таблице анализов. А мне нужно выводить все ЛПУ из таблицы lpu, и там где нет соответсвие просто писалось NULL. Помогите исправить запрос

Автор: DimW 21.4.2010, 13:04
Цитата(lumentek @  21.4.2010,  12:56 Найти цитируемый пост)
А мне нужно выводить все ЛПУ из таблицы lpu, и там где нет соответсвие просто писалось NULL. Помогите исправить запрос 


так?
Код

SELECT
    lpu.name_lpu,
    lab_analyses.lpu_id
FROM
    lab_analyses
LEFT JOIN
    lpu ON lpu.lpu_id = lab_analyses.lpu_id
WHERE
    lab_analyses.`data` BETWEEN '2010-01-01' AND '2010-04-31'
    AND lab_analyses.`id_type_research` = 15
ORDER BY 
    lpu.name_lpu 

Автор: azesmcar 21.4.2010, 13:07
Цитата(lumentek @  21.4.2010,  12:56 Найти цитируемый пост)
1. Запрос подсчитывает общее количество проведеных анализов  у для каждого лпу, но только те ЛПУ которые, id которых есть в таблице анализов. А мне нужно выводить все ЛПУ из таблицы lpu, и там где нет соответсвие просто писалось NULL

OUTER JOIN?

Автор: DimW 21.4.2010, 13:16
натупил - отношения местами поменять нужно:

Код

FROM
    lpu
LEFT JOIN
    lab_analyses ON lpu.lpu_id = lab_analyses.lpu_id



azesmcar, LEFT JOIN и так OUTER по умолчанию.

Автор: azesmcar 21.4.2010, 13:23
DimW

Ага, код запроса не посмотрел, по тексту вопроса показалось что автору это нужно. smile 

Автор: lumentek 21.4.2010, 13:41
Сделал так как вы сказали
Код

SELECT
 lpu.name_lpu,lab_analyses.data, lab_analyses.lpu_id
FROM
 lpu
 LEFT JOIN
 lab_analyses ON lpu.lpu_id  = lab_analyses.lpu_id 
WHERE
    lab_analyses.`data` BETWEEN '2010-01-01' AND '2010-04-31'
    AND lab_analyses.`id_type_research` = 15
GROUP BY
    lpu.lpu_id 
 ORDER BY 
 lpu.name_lpu 


все равно пустых значений нет(((( Что же может быть.  В таблице lpu 80 записей, а запрос выводит 43. По идее должно быть еще 37 пустых (NULL) значений((
            
            

Автор: lumentek 21.4.2010, 14:06
странно получается. если убираю where условие вообще, то все норм пашет. С чего бы это?

Автор: DimW 21.4.2010, 14:08
Цитата(lumentek @  21.4.2010,  13:41 Найти цитируемый пост)
Сделал так как вы сказали

нет не так - убери GROUP BY.

Автор: lumentek 21.4.2010, 14:09
о все разобрался

Автор: DimW 21.4.2010, 14:09
Цитата(lumentek @  21.4.2010,  13:41 Найти цитируемый пост)
 В таблице lpu 80 записей

сколько записей в таблице lab_analyses?

Добавлено через 32 секунды
Цитата(lumentek @  21.4.2010,  14:09 Найти цитируемый пост)
о все разобрался 

так вчем затык был?

Добавлено через 1 минуту и 27 секунд
Цитата(lumentek @  21.4.2010,  14:06 Найти цитируемый пост)
если убираю where условие вообще, то все норм

все понял.

Автор: lumentek 21.4.2010, 14:15
вот правильный запрос (спасибо Вам всем огромное)
Код

SELECT
 lpu.name_lpu,lab_analyses.data, lab_analyses.lpu_id
FROM
 lpu
LEFT JOIN
    lab_analyses ON lpu.lpu_id  = lab_analyses.lpu_id 
    AND lab_analyses.`data` BETWEEN '2010-01-01' AND '2010-04-31'
    AND lab_analyses.`id_type_research` = 15
GROUP BY
    lpu.lpu_id,
    lab_analyses.`data` 
 ORDER BY 
 lpu.name_lpu 
            
            


Тут я даже сразу группирую  и по ЛПУ и по дате.

Теперь мне нужна помощь от вас  вот в чем.

Как мне в каждую строчку вывести  ЛПУ с разбивкой по дате.
Тоесть вот так, например :

1 поликлиника: 1,2,3,4,5....31
2 поликлиника : 1,2,3....30 и.т.д
и.т.д.

Тоесть тут уже чистый php в помощь нужен. Какие есть предложение?

Добавлено через 1 минуту и 36 секунд
Цитата(DimW @ 21.4.2010,  14:09)
Цитата(lumentek @  21.4.2010,  13:41 Найти цитируемый пост)
 В таблице lpu 80 записей

сколько записей в таблице lab_analyses?



Добавлено @ 14:10
Цитата(lumentek @  21.4.2010,  14:06 Найти цитируемый пост)
если убираю where условие вообще, то все норм

все понял.

Добавлено @ 14:09
Цитата(lumentek @  21.4.2010,  14:09 Найти цитируемый пост)
о все разобрался 

так вчем затык был?

Затык был в том,  что я where не нужно было, а точнее оно должно было быть в JOIN констуркции

Автор: DimW 21.4.2010, 14:51
Цитата(lumentek @  21.4.2010,  14:15 Найти цитируемый пост)
Тут я даже сразу группирую  и по ЛПУ и по дате.

какой смысл группировки без агрегации?

Цитата(lumentek @  21.4.2010,  14:15 Найти цитируемый пост)
Тоесть тут уже чистый php в помощь нужен. Какие есть предложение?

если хотите использовать пхп, то в соответствующую ветку обратитесь, а лучше доку откройте - в цикле по резалтсет нет ничего сложного.

Автор: lumentek 21.4.2010, 14:59
Цитата

Цитата(lumentek @  21.4.2010,  14:15 Найти цитируемый пост)
Тут я даже сразу группирую  и по ЛПУ и по дате.

какой смысл группировки без агрегации?


агрегация есть, я просто тут ее не указал

Автор: lumentek 21.4.2010, 18:46
только что обратил внимаения что в данном запросе не совпадает диапазон дат. тоесть дата выходит за рамки диапазона between. В чем опять мой косяк? тип данных date

Автор: DimW 22.4.2010, 09:02
Цитата(lumentek @  21.4.2010,  18:46 Найти цитируемый пост)
в данном запросе


Цитата(lumentek @  21.4.2010,  14:59 Найти цитируемый пост)
я просто тут ее не указал


в каком?


Цитата(lumentek @  21.4.2010,  18:46 Найти цитируемый пост)
тоесть дата выходит за рамки диапазона between

пример приведи как она выходит. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)