Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите составить запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
3d_killer
Отправлено: 19 Мая, 2015 - 09:34:23
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




Есть 2 таблицы соотношение один ко многим, группировка по первой таблице, во второй таблице соответствующих значений одной записи много, необходимо чтобы выбрало последнюю по дате, сейчас хватает первую.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT counter.*, result.value,result.`date`
  3. FROM counter
  4. LEFT JOIN result ON
  5. result.counter=counter.id
  6. WHERE counter.apartment=:id GROUP BY counter.id ORDER BY result.`date` DESC


таблицы:
counter

id | apartment | code | name

result

id | counter | value | date

//связь counter.id=result.counter // одному значению в таблице counter соответствует много значений в таблице result

(Отредактировано автором: 19 Мая, 2015 - 09:45:10)

 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 19 Мая, 2015 - 10:12:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT tbl2.*
  2.     FROM (
  3.         SELECT *
  4.             FROM tbl1
  5.             ORDER BY sort DESC
  6.     ) sorted
  7.     INNER JOIN tbl2
  8.         ON tbl2.x = sorted.x
  9.     GROUP BY tbl2.y
 
 Top
3d_killer
Отправлено: 19 Мая, 2015 - 10:44:36
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




если я правильно понял
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2.             FROM tbl1
  3.             ORDER BY sort DESC
  4.     ) sorted
тут должна быть вторая таблица так как сортировка по ней, подставляю названия таблиц и ругается на неизвестную таблицу тут tbl1 (result)
 
My status
 Top
Sail
Отправлено: 19 Мая, 2015 - 16:31:19
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




DeepVarvar, ему ещё правильные данные из других столбцов tbl1 нужны...
3d_killer, можно так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT cntr.*, r1.`value`, r1.`date` FROM `counter` cntr
  2. JOIN `result` r1 ON r1.`counter` = cntr.`id`
  3. JOIN (
  4.   SELECT `counter`, max(`date`) AS maxdate FROM `result` GROUP BY `counter`
  5. ) sub_r1 ON sub_r1.`counter` = r1.`counter` AND sub_r1.`maxdate` = r1.`date`
  6. WHERE cntr.`apartment` = :id;
  7.  
 
 Top
3d_killer
Отправлено: 19 Мая, 2015 - 19:16:34
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




Sail вроде так, спасибо большое
(Добавление)
а не, не так, если во второй таблице данных нет то нет выборки по первой таблице, то есть нулевой результат, а данные из первой таблицы должны быть всегда
 
My status
 Top
Sail
Отправлено: 20 Мая, 2015 - 09:16:58
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




3d_killer пишет:
а данные из первой таблицы должны быть всегда

Преобразуем:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT cntr.*, sub1.`value`, sub1.`date` FROM `counter` cntr
  2. LEFT JOIN
  3. (
  4.   SELECT r1.`counter`, r1.`value`, r1.`date` FROM `result` r1
  5.   JOIN (
  6.     SELECT `counter`, max(`date`) AS maxdate FROM `result` GROUP BY `counter`
  7.   ) sub_r1 ON sub_r1.`counter` = r1.`counter` AND sub_r1.`maxdate` = r1.`date`
  8. ) sub1 ON sub1.`counter` = cntr.`id`
  9. WHERE cntr.`apartment` = :id

(Отредактировано автором: 20 Мая, 2015 - 10:39:05)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB