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
Форумы портала PHP.SU :: Версия для печати :: Помогите составить запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Помогите составить запрос

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

1. 3d_killer - 19 Мая, 2015 - 09:34:23 - перейти к сообщению
Есть 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
2. DeepVarvar - 19 Мая, 2015 - 10:12:45 - перейти к сообщению
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
3. 3d_killer - 19 Мая, 2015 - 10:44:36 - перейти к сообщению
если я правильно понял
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2.             FROM tbl1
  3.             ORDER BY sort DESC
  4.     ) sorted
тут должна быть вторая таблица так как сортировка по ней, подставляю названия таблиц и ругается на неизвестную таблицу тут tbl1 (result)
4. Sail - 19 Мая, 2015 - 16:31:19 - перейти к сообщению
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.  
5. 3d_killer - 19 Мая, 2015 - 19:16:34 - перейти к сообщению
Sail вроде так, спасибо большое
(Добавление)
а не, не так, если во второй таблице данных нет то нет выборки по первой таблице, то есть нулевой результат, а данные из первой таблицы должны быть всегда
6. Sail - 20 Мая, 2015 - 09:16:58 - перейти к сообщению
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

 

Powered by ExBB FM 1.0 RC1