SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.10.2011 21:05:24

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Есть две таблицы:

Первая таблица:
CREATE TABLE IF NOT EXISTS `table` (
  `id_table` int(10) unsigned NOT NULL AUTO_INCREMENT,
  ...
  остальные поля, их много и они в данном случае не важны
  ...

  PRIMARY KEY (`id_table`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

Вторая таблица:
CREATE TABLE IF NOT EXISTS `ocenki` (
  `id_table` int(10) unsigned NOT NULL,
  `id_otpr` int(10) unsigned NOT NULL,
  `ocenka` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`id_table`,`id_otpr`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Нужно отсортировать вывод записей из первой таблице по среднему значению во второй таблице.
Используя интернет и свои пока не богатые познания в MySQL пробовал составлять такие запросы:

$query="SELECT table.*, avg(ocenka) FROM table LEFT JOIN ocenki ON table.id_table=ocenki.id_table GROUP BY table.id_table ORDER BY avg(ocenka) DESC";

$query="SELECT table.*, ifnull(c.s,0) FROM table left join (SELECT id_table, avg(ocenka) AS s FROM ocenki) c ON table.id_table=ocenki.id_table ORDER BY s DESC";

Соответственно оба запроса не работают. Подскажите, как должен выглядеть работающий запрос? Может нужно в моих запросах что-то переделать, или нужно совсем другой запрос писать? Вообщем, буду благодарен за любую помощь)

Отредактированно angelmax (28.10.2011 21:06:31)

Неактивен

 

#2 28.10.2011 22:38:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

$query="SELECT `table`.* FROM `table` left join (SELECT id_table, avg(ocenka) AS s FROM ocenki group by id_table) c ON table.id_table=ocenki.id_table ORDER BY s DESC";

Неактивен

 

#3 28.10.2011 22:50:52

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Этот вариант не работает, ничего из БД не извлекается

Неактивен

 

#4 28.10.2011 22:59:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

mysql> select * from g;
+------+
| x    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.00 sec)

mysql> select * from p order by y;
+------+-------+
| y    | data  |
+------+-------+
|    1 |     4 |
|    1 |     9 |
|    1 |     6 |
|    1 |     3 |
|    1 |     7 |
|    2 |     9 |
|    2 |    99 |
|    2 |    16 |
|    2 |    13 |
|    2 |    27 |
|    2 |    48 |
|    3 |   172 |
|    3 |   652 |
|    3 |   444 |
|    3 |   781 |
|    3 |   721 |
|    4 |  1327 |
|    4 |  1663 |
|    4 |  4854 |
|    4 |  9953 |
|    4 |  2723 |
|    5 | 16639 |
|    5 | 12327 |
|    5 | 48545 |
|    5 | 27423 |
|    5 | 99530 |
+------+-------+
26 rows in set (0.00 sec)

mysql> select g.* from g left join (select y, avg(`data`) aa from p group by y)
t on g.x=t.y order by aa desc;
+------+
| x    |
+------+
|    5 |
|    4 |
|    3 |
|    2 |
|    1 |
+------+
5 rows in set (0.00 sec)

Неактивен

 

#5 28.10.2011 23:03:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

angelmax написал:

Этот вариант не работает, ничего из БД не извлекается

Да, действительно. Только напечатав пример заметил, что в постах №2 и 4 есть одно существенное отличие. Сами найдете?

Неактивен

 

#6 28.10.2011 23:15:22

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Пока я вижу только различия в использовании обратных кавычек - но насколько я знаю их использование/неиспользование непринципиально, и AS после avg. Но я был уверен что использование as обязательно, мне сказали что так же дело добровольное.

Неактивен

 

#7 28.10.2011 23:17:06

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

table.id_table=с.id_table - в этом разница?

Неактивен

 

#8 28.10.2011 23:22:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Нет, различие в условии связи (там где ON)
В вашем исходном запросе в условии связи указана таблица ocenki, в то время как джойните вы с таблицей c.
Если бы у вас в скрипте стояла обработка ошибок или предварительно вы тестили запрос непосредственно в бд, то увидели бы текст ошибки, а не "ничего из БД не извлекается".

Неактивен

 

#9 28.10.2011 23:24:08

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Все, заработало, спасибо за помощь) Пользуясь случаем так сказать, можете объяснить - as перед псевдонимом дело добровольное, или есть случае когда оно необходимо, его использовать нельзя? И функцию ифнуль здесь использовать не надо? В каких она случаях нужна?

Неактивен

 

#10 28.10.2011 23:33:06

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

И еще 1 вопрос (сорри за может быть тупые вопросы, просто учусь на практике, предварительно прочитав пару книг по пхп). Как напечатать теперь среднюю оценку? Посылаем запрос, пишем такой цикл: while($row = $results->fetch_assoc()) { ...... } Средняя оценка хранится в массиве с каким ключом?

Неактивен

 

#11 28.10.2011 23:36:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

angelmax написал:

Все, заработало, спасибо за помощь) Пользуясь случаем так сказать, можете объяснить - as перед псевдонимом дело добровольное

Добровольное, но с ним запрос читабельней.

angelmax написал:

И функцию ифнуль здесь использовать не надо? В каких она случаях нужна?

Если в выборке присутствуют null значения, то при сортировке по возрастанию сначала идут null. Если вас не устраивает такой результат, то придется использовать ifnull().

Неактивен

 

#12 28.10.2011 23:39:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

angelmax написал:

И еще 1 вопрос (сорри за может быть тупые вопросы, просто учусь на практике, предварительно прочитав пару книг по пхп). Как напечатать теперь среднюю оценку? Посылаем запрос, пишем такой цикл: while($row = $results->fetch_assoc()) { ...... } Средняя оценка хранится в массиве с каким ключом?

В данном случае ни с каким smile
В исходной задаче вы поставили "Нужно отсортировать вывод записей из первой таблице", поэтому запрос выбирает только записи из первой таблицы
SELECT `table`.* FROM

Чтобы получить оценку, её нужно включить в список выбираемых полей.

Неактивен

 

#13 28.10.2011 23:42:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Кстати, что касается использования/неиспользования обратных кавычек, то вопрос может оказаться принципиальным при использовании в качестве имен столбцов,таблиц и т.д. ключевых слов. Сравните:

mysql> alter table a add select int;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t int'
at line 1
mysql> alter table a add `select` int;
Query OK, 6 rows affected (0.44 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select select from a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t from a'
at line 1
mysql> select `select` from a;
+--------+
| select |
+--------+
|   NULL |
|   NULL |
|   NULL |
|   NULL |
|   NULL |
|   NULL |
+--------+
6 rows in set (0.00 sec)

Неактивен

 

#14 28.10.2011 23:49:04

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

vasya написал:

angelmax написал:

И еще 1 вопрос (сорри за может быть тупые вопросы, просто учусь на практике, предварительно прочитав пару книг по пхп). Как напечатать теперь среднюю оценку? Посылаем запрос, пишем такой цикл: while($row = $results->fetch_assoc()) { ...... } Средняя оценка хранится в массиве с каким ключом?

В данном случае ни с каким smile
В исходной задаче вы поставили "Нужно отсортировать вывод записей из первой таблице", поэтому запрос выбирает только записи из первой таблицы
SELECT `table`.* FROM

Чтобы получить оценку, её нужно включить в список выбираемых полей.

То есть, выбирается только то, что стоит перед Фром? Я был уверен, что лефт джойн "дополняет" значения из левой таблицы в данном случае средней оценкой и извлекается с ними... Тогда простите за назойливость, можете подсказать как дополнить запрос, чтобы бы он выбирал еще среднее значение по каждой записи, или это не возможно сделать в 1 запросе?

Неактивен

 

#15 28.10.2011 23:50:54

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

vasya написал:

Кстати, что касается использования/неиспользования обратных кавычек, то вопрос может оказаться принципиальным при использовании в качестве имен столбцов,таблиц и т.д. ключевых слов. Сравните:

mysql> alter table a add select int;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t int'
at line 1
mysql> alter table a add `select` int;
Query OK, 6 rows affected (0.44 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select select from a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t from a'
at line 1
mysql> select `select` from a;
+--------+
| select |
+--------+
|   NULL |
|   NULL |
|   NULL |
|   NULL |
|   NULL |
|   NULL |
+--------+
6 rows in set (0.00 sec)

Про ключевые слова я знаю, в принципе я стараюсь всегда поэтому использовать обратные кавычки.

Неактивен

 

#16 28.10.2011 23:58:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Дополняет, и даже сортирует по значениям средней оценки, но в конечном счете отдает только то, что вы попросили в части перечисления полей (между select и from).
Соответственно, нужно указать все поля какие вы хотите получить:
SELECT table.*, c.s FROM

Кстати, * лучше не использовать, а перечислять поля в явном виде, даже если вам нужны все поля из таблицы. Потом вы добавите в таблицу какое-нибудь текстовое поле, которое не нужно будет выбирать в данном запросе и вряд ли вспомните о необходимости поправить данный запрос.

Неактивен

 

#17 29.10.2011 00:07:20

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

vasya написал:

Дополняет, и даже сортирует по значениям средней оценки, но в конечном счете отдает только то, что вы попросили в части перечисления полей (между select и from).
Соответственно, нужно указать все поля какие вы хотите получить:
SELECT table.*, c.s FROM

Кстати, * лучше не использовать, а перечислять поля в явном виде, даже если вам нужны все поля из таблицы. Потом вы добавите в таблицу какое-нибудь текстовое поле, которое не нужно будет выбирать в данном запросе и вряд ли вспомните о необходимости поправить данный запрос.

И потом эта средняя оценка хранится в массиве с ключом (в описанном мной случае) $row['c.s'] Или нет? А за совет спасибо, думаю действительно лучше сейчас потратить лишние пару минут, чем потом пару часов)

Практическим путем понял, что ключ - s. Что в принципе логично. И как следствие, если в двух таблицах есть поля с одинаковыми именем и разным значением я их извлекаю оба (опустим причину, вдруг понадобится), то нужно им давать псевдонимы обязательно?
Белых пятен пока много, но с опытом становится все меньше)

Отредактированно angelmax (29.10.2011 00:10:45)

Неактивен

 

#18 29.10.2011 00:21:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

angelmax написал:

И как следствие, если в двух таблицах есть поля с одинаковыми именем и разным значением я их извлекаю оба (опустим причину, вдруг понадобится), то нужно им давать псевдонимы обязательно?

Да.

Неактивен

 

#19 29.10.2011 00:24:02

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным (среднему значению) в другой таблице

Спасибо за помощь)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson