Консультация № 176085
17.01.2010, 00:02
45.00 руб.
0 5 1
Здравствуйте эксперты.
Помогите, пожалуйста, довести до ума запрос к базе данных.
Есть страница с тремя фотоконкурсами, таких конкурсов постоянно будет три.Для каждого конкурса выводится фотография лидера.
Если у фотографий во всех конкурсах кол-во голосов 0, то все три конкурса не выводятся, а выводит только два конкурса, например, "1 конкурс", "1 конкурс", "2 конкурс".Все три конкурса появляются только тогда, когда фото наберут какое то кол-во голосов(сделать это можно только через админку).
При голосовании за любую фотографию, уже к существующим голосам, плюсуется 1, нет ни каких расчётов, просто целое число.
Задача в том, чтобы при любом кол-ве голосов, для любой фотографии, выводились все три конкурса.
Как дописать или изменить запрос к базе данных?
Вот ссылка для наглядности
http://test.roganov.kharkov.ua/d4/contest.php
В прикреплённом файле (2.1 кб) - сам запрос, структура базы данных и дамп базы.

Обсуждение

Неизвестный
18.01.2010, 11:09
общий
это ответ
Здравствуйте, Slo_nik.

Вы выбрали максимальный голос, но если фотографий с таким голосом будет несколько в одном конкурсе, то он отодвинет остальные за пределы указаного Вами "LIMIT 3" . Надо всегда обеспечит выбор только одной фотографии в пределах конкурса, например с максимальным id, и выводить только ее. При таких условиях можете увеличить/уменьшить количество конкурсов - все равно будет выводится в каждом один из лидеров (отпадает необходимость в "LIMIT 3"). Запрос получается приблизительно такой:

$query = "SELECT con.small AS small,
con.titleph AS title,
con.id_contest AS id_us,
con.id_contest_cat AS id_con_us,
con.vote AS mvote,
cont.id_contest_cat AS id_cont,
cont.name AS name
FROM(
select q.id_contest_cat, max(q.id_contest) as id_contest

FROM (SELECT contest.id_contest_cat,
MAX(contest.vote) AS mvote
FROM contest
GROUP BY contest.id_contest_cat) AS cq
LEFT JOIN contest AS c ON (cq.mvote = contest.vote) and (cq.id_contest_cat=contest.id_contest_cat)
GROUP BY q.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.vote DESC";
5
Благодарю за помощь, всё отлично работает.
Неизвестный
18.01.2010, 21:25
общий
Здравствуйте, PVS@Lviv!
Благодарю за ответ, но у меня возник вопрос. Попробывал запустить запрос, мне выдало ошибку "Warning: mysql_fetch_assoc(): supplied argument is ..." и я не могу её отловить.
Подскажите, пожалуйста, куда идёт AS с в строке LEFT JOIN contest AS c ON (cq.mquote = contest.quote) AND (cq.id_contest_cat=contest.id_contest_cat).
С остальными псевдонимами мне более менее понятно, ход Вашей мысли почти уловил, но довести до ума пока не могу(не хватает опыта).
Неизвестный
19.01.2010, 10:11
общий
никуда не идет, более того - гадит. Я просто когда копипастил строчки что-то прохлопал. Уберите "AS c" и должно работать.

Попробую "разложить по полочкам":

Код:

SELECT
con.small AS small,
con.titleph AS title,
con.id_contest AS id_us,
con.id_contest_cat AS id_con_us,
con.vote AS mvote,
cont.id_contest_cat AS id_cont,
cont.name AS name

FROM(

select
q.id_contest_cat,
max(q.id_contest) as id_contest

FROM (

SELECT
contest.id_contest_cat,
MAX(contest.vote) AS mvote
FROM contest
GROUP BY contest.id_contest_cat

) AS cq
LEFT JOIN contest ON (cq.mvote = contest.vote) and (cq.id_contest_cat=contest.id_contest_cat)
GROUP BY q.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.vote DESC
Неизвестный
19.01.2010, 17:24
общий
Просмотрел ещё раз строчка за строчкой весь запрос, но всётаки есть ошибка и запрос отказывается работать, ругается на q.id_contest_cat, дословно Unknown column 'q.id_contest_cat' in 'field list'
Как я понял, здесь попытка получить максимальный id.
Вчера я попытался тоже "разложить по полочкам" - наш разклад совпал :)
Неизвестный
19.01.2010, 18:19
общий
Немного разобрался, заменил q и так далее на contest вроде заработало, потестирую, посмотрю, что получится, по результату отпишусь.
Форма ответа