Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: вывод из базы с максимальным значением поля

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]  [51-54] 

 
 автор: Slo_Nik   (20.01.2010 в 01:03)   письмо автору
 
   для: Trianon   (20.01.2010 в 00:46)
 

Да я не против, пусть как хотят переименовывают, конечно если это принесёт пользу.
Но тогда надо отредактировать её, убрать лишнее....
Но я думаю, что предложеное название не совсем точно...

  Ответить  
 
 автор: Trianon   (20.01.2010 в 00:46)   письмо автору
 
   для: Slo_Nik   (20.01.2010 в 00:30)
 

На самом деле, весьма желательно эту тему переименовать в
"Как получить из таблицы строку с максимальным значением поля?"
Вопрос такой поднимается довольно часто, подводных камней у него масса.
А тут где-то как-то даже подход нарисовался...

  Ответить  
 
 автор: Slo_Nik   (20.01.2010 в 00:30)   письмо автору
 
   для: Slo_Nik   (16.12.2009 в 12:57)
 

Много было в этой теме написано, много дельных советов, спасибо Trianon и Лена.
Для тех, кому интересно решение этой проблемы привожу запрос

"SELECT con.small AS small,
         con.titleph AS title,
         con.id_contest AS id_us,
         con.id_contest_cat AS id_con_us,
         con.quote AS mquote,
         cont.id_contest_cat AS id_cont,
         cont.name AS name
      FROM(select contest.id_contest_cat,
                     max(contest.id_contest) as id_contest
                    FROM(SELECT contest.id_contest_cat,
                            MAX(contest.quote) AS mquote
                           FROM contest
                       GROUP BY contest.id_contest_cat) AS cq
                      LEFT JOIN contest ON (cq.mquote = contest.quote) and (cq.id_contest_cat=contest.id_contest_cat)
                       GROUP BY contest.id_contest_cat) as q
        LEFT JOIN contest AS con ON (q.id_contest = con.id_contest)
        LEFT JOIN contest_cat AS cont ON (cont.id_contest_cat = con.id_contest_cat)
        ORDER BY con.quote DESC LIMIT 3"

Проверено, работает.

  Ответить  
 
 автор: Лена   (23.12.2009 в 11:32)   письмо автору
 
   для: Slo_Nik   (23.12.2009 в 11:13)
 

-

  Ответить  
 
 автор: Slo_Nik   (23.12.2009 в 11:13)   письмо автору
 
   для: Лена   (23.12.2009 в 11:00)
 

мне без разницы как будет выводится, главное, что бы выводились группы, все три, 15,16,17, а какой последовательности не важно.
ещё главное условие, что бы для каждой группы, выводилось одна фотография с макс. quote,а если quote = 0, то порядок вывода групп не нарушался.
вот до этого я пока додуматься не могу.

  Ответить  
 
 автор: Лена   (23.12.2009 в 11:00)   письмо автору
 
   для: Slo_Nik   (23.12.2009 в 09:55)
 

Смотрите. Простой запрос,без максимума у меня выводит так:
17- Третий
15 - Первый
16 - Второй
Сложный запрос выводит категории так:
15 - Первый
17-Третий
16 - Второй.
А Вам как надо?

  Ответить  
 
 автор: Slo_Nik   (23.12.2009 в 09:55)   письмо автору
 
   для: Лена   (23.12.2009 в 00:09)
 

смотрите, что получается.
проблема в том, что если quote равно "0", группы фотографий выводятся не по порядку, 1 , 2 , 3, а, например, 2 , 2 , 1. всего надо три группы вывести, да их и будет всего три.
если сделать простой запрос, как писал выше Trianon, то при подсчёте max quote,даже если quote = "0", группы выводятся как положено, 1 , 2 , 3.
вот эта часть запроса, через id_contest_cat связвываются две таблицы.

(SELECT `contest`.`id_contest_cat`,
        MAX(`contest`.`quote`) AS `mquote`
     FROM `contest`
GROUP BY `contest`.`id_contest_cat`) AS `q`

этот запрос нужен для того, что бы для каждой группы вывести одну фотографию с макс. quote.
делаю простой запрос для получения списка групп фотографий

SELECT
                  `contest_cat`.`id_contest_cat` AS `id_cont`,
                  `contest_cat`.`name` AS `name`
     FROM `contest_cat`

получаю вывод всех трёх групп как и положено, 1 , 2 , 3, всё совпадает, имена групп соответствуют id групп.

теперь когда объеденяю эти два запроса(пример запроса выше), получается, что весь вывод ломается, группы выводятся не по порядку, а, например, 2 , 2 , 1
вот вопрос в том, как сохранить порядок вывода групп?

  Ответить  
 
 автор: Лена   (23.12.2009 в 00:09)   письмо автору
 
   для: Slo_Nik   (22.12.2009 в 23:09)
 

У вас по ссылке, которую привели выше, три группы, в каждой группе - фото с максимальным quote.
Я вам пыталась постом выше сказать: допустим, в каждой группе все фото с quote = "0". Еще понятнее. Группа 1. Самая левая. В ней, допустим, у вас три фото. У каждого фото quote = "0". И вы хотите из этих quote выбрать максимум. Это невозможно.
Вот есть у вас три вещи. Каждая из них стоит, допустим, 100 грн. Вы можете выбрать из этих трех вещей ту, которая больше всего стоит? У вас три цифры: 100, 100, 100 - можно из них максимум выбрать? Точно так же и с нолями.
У вас проблема не в LEFT JOIN `contest`, а в основной таблице, к которой соединяются столбцы из других таблиц.
Основная таблица SELECT `contest`.`id_contest_cat`, MAX(`contest`.`quote`)... не сможет из нолей выбрать максимум. А значит SQL вам подсунет какую-то ерунду. Мне так, по крайней мере кажется.
Поэтому вы должны решить: если у вас все quote = "0", вам или внутри этого запроса влепить условие исполнять его только, если quote != "0", или как-то по-другому... Подумаю, завтра на свежую голову скажу, уже спать хочется.

  Ответить  
 
 автор: Slo_Nik   (22.12.2009 в 23:09)   письмо автору
 
   для: Лена   (22.12.2009 в 23:00)
 

сам запрос

SELECT `con`.`small` AS `small`,
                  `con`.`titleph` AS `title`,
                  `con`.`id_contest` AS `id_us`,
                  `con`.`id_contest_cat` AS `id_con_us`,
                  `con`.`quote` AS `quote`,
                  `cont`.`id_contest_cat` AS `id_cont`,
                  `cont`.`name` AS `name`
             FROM (SELECT `contest`.`id_contest_cat`,
                      MAX(`contest`.`quote`) AS `mquote`
                     FROM `contest`
                 GROUP BY `contest`.`id_contest_cat`) AS `q`
             LEFT JOIN `contest` AS `con` ON (`q`.`mquote` = `con`.`quote`)
             LEFT JOIN `contest_cat` AS `cont` ON (`cont`.`id_contest_cat` = `con`.`id_contest_cat`)
             ORDER BY `con`.`quote` DESC
             LIMIT 3

этот запрос нормально работает, когда у всех фото или практически у всех есть голоса, т.е. quote не равно "0". тогда на главной странице выводится название для каждой группы и одно фото с максимальным quote для определённой группы.
если quote равно "0" у всех фото, тогда выводятся всего 2-е группы, для одной группы две позиции на странице, для другой одна.
получается, что если quote = "0", то надо будет сортировать по id сами фото,
если взять из запроса ту часть, где определяется максимальное quote, то даже с нулевым значением выводятся все группы.

  Ответить  
 
 автор: Лена   (22.12.2009 в 23:00)   письмо автору
 
   для: Slo_Nik   (22.12.2009 в 20:14)
 

Вы выводите для каждой группы одну фотографию с максимальным количеством голосов.
Допустим, у каждого из фото количество голосов "0". Как можно из кучи нолей выбрать максимум?
Вам в запросе нужно тогда поставить условие: если quote = 0, то или вообще не выбираем ничего, или выбираем фото с наибольшим(наименьшим) id. Вы что хотите вывести?
Приведите, пожалуйста, сам запрос, который у вас получился.

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]  [51-54] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования