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 » » Работа с СУБД » Максимальное значение

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

1. ensik - 27 Декабря, 2011 - 13:13:22 - перейти к сообщению
Привет всем!
БД: MySql
Есть таблица с полями: id,name,picture,vote.

Нужно из нее вытащить содержимое name,picture строки, в которой vote - максимальный
Цель: Вывести Имя и фото того, у кого найбольшее количество голосов.

Пытался тянуть так:
Но выводит первое попавшийся елемент, а не максимальный
PHP:
скопировать код в буфер обмена
  1. $res = mysql_query("SELECT * FROM `table` WHERE `vote`=(SELECT max(`vote`) FROM `table`)");
  2.  
  3. $row = mysql_fetch_assoc($res);
  4.  
  5.  
  6. // дале вывод содержимого



Заранее спасибо.
2. EuGen - 27 Декабря, 2011 - 13:18:05 - перейти к сообщению
CODE (sql):
скопировать код в буфер обмена
  1. SELECT * FROM `table` ORDER BY `vote` DESC LIMIT 1
3. ensik - 27 Декабря, 2011 - 13:23:44 - перейти к сообщению
EuGen пишет:
CODE (sql):
скопировать код в буфер обмена
  1. SELECT * FROM `table` ORDER BY `vote` DESC LIMIT 1


Спасибо, выручил!
4. Самогонщик - 27 Декабря, 2011 - 13:34:35 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT max(`vote`) FROM `table`

Сложность о(н), а ORDER BY требует сортировки о (н*лог(н)) + памяти о(н). Хотя я не ручаюсь сказать, что будет быстрее, если мускл использует оптимизацию основываясь на LIMIT 1

ensik, можешь ли ты сравнить скорость выполнения этих запросов?
(Добавление)
Стоп, сейчас меня отпустит
(Добавление)
Нужно внимательнее было читать
5. EuGen - 27 Декабря, 2011 - 13:40:00 - перейти к сообщению
Это и я могу сказать:
- случай для первичного ключа:
PHP:
скопировать код в буфер обмена
  1. mysql> explain select max(id) from users;
  2. +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
  4. +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
  5. |  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away |
  6. +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
  7. 1 row in set (0.07 sec)
  8.  
  9. mysql> explain select id from users order by id limit 1;
  10. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
  11. | id | select_type | table       | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
  12. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
  13. |  1 | SIMPLE      |       users | index | NULL          | PRIMARY | 4       | NULL |    1 | Using index |
  14. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
  15. 1 row in set (0.07 sec)


И в случае, если индекса нет никакого:
PHP:
скопировать код в буфер обмена
  1. mysql> explain select max(approve_code) from users;
  2. +----+-------------+-------------+------+---------------+------+---------+------+--------+-------+
  3. | id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows   | Extra |
  4. +----+-------------+-------------+------+---------------+------+---------+------+--------+-------+
  5. |  1 | SIMPLE      |       users | ALL  | NULL          | NULL | NULL    | NULL | 651490 |       |
  6. +----+-------------+-------------+------+---------------+------+---------+------+--------+-------+
  7. 1 row in set (0.07 sec)
  8.  
  9. mysql> explain select approve_code  from users order by approve_code desc limit 1;
  10. +----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
  11. | id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows   | Extra          |
  12. +----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
  13. |  1 | SIMPLE      |       users | ALL  | NULL          | NULL | NULL    | NULL | 651490 | Using filesort |
  14. +----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
  15. 1 row in set (0.07 sec)


- Разница есть в обоих случаях в пользу первого варианта. Но не забывайте, что, просто выбрав MAX, Вам еще нужно будет сделать второй запрос на выбор всего нужного. В случае индекса это да, выигрыш(правда, почти ничтожный). Но в случае его отсутствия - это еще один FULL SCAN.

 

Powered by ExBB FM 1.0 RC1