|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Есть 4 таблицы, но к запросу относятся только 3: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Нужно вывести максимальную ставку по лотам в которых закончилась дата публикации "date_end", в тоже время нету победителя "winner". Победитель определяется максимальной ставкой на момент окончания действия лота. Ставка "amount" в таблице ставок "rate". Когда будет определен победитель в столбец "winner" записывается id пользователя, который сделал наибольшую ставку. Записываться скорее всего будет уже через PHP, в отдельном запросе. То есть нужно выбрать ставку, чтобы столбец " winner " таблицы " lot " был пустым, " date_end " таблицы " lot " был меньше текущего времени и ставка " amount " таблицы " rate " была наибольшей по этому лоту. Пока что пришел к такому запросу: Код: sql 1. 2. 3. 4. 5.
но данные из таблицы user выводятся не правильные, как будто нет связи между таблицами rate и user. Не понимаю почему. Если убрать ANY_VALUE(), то пишет ошибку, что ему не понятно какие данные выбирать. #1055 - Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yeticave.u.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 12:14 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67, Используйте форматирование кода Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 12:48 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, А тут можно отредактировать сообщение? не могу найти как ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:01 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67 Gluck99, А тут можно отредактировать сообщение? не могу найти как ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:05 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, Ну теперь видимо не поменяю никак тогда. А создавать еще одну тему с тем же вопросом ну такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:16 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67 Gluck99, Ну теперь видимо не поменяю никак тогда. А создавать еще одну тему с тем же вопросом ну такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:20 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
miksoft, Большое спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:31 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67, 1) Так у вас же inner join'ы, логично, если нет соответствия, ничего возвращено не будет. 2) Надо упростить запрос до минимума и переписать его нормально, без ANY_VALUE() - это зло в общем случае. 3) Логично что ошибку даёт, у вас записи негарантированно уникальные. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 13:58 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, Вот я и хотел бы закрыть пробел в знаниях. Если писать Код: plsql 1. 2. 3. 4. 5.
, то выводит таблицу с лишними данными. Прикрепил изображение. Как я понял он выводит всех пользователей, которые делали ставки на эти лоты. Но я не могу понять почему. Я же вроде указываю что мне нужны только максимальные ставки. И эти максимальные ставки соотвествуют только одному пользователю. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 15:33 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67, Почему понятно - потому что группировка должна делаться по r.lot_id. Тут нужен вложенный запрос. В связи с этим вопрос: а lot.id_user и rate.id_user содержат один и тот же идентификатор пользователя, если lot.id = rate.id_lot? Я не могу понять как ваши таблицы соотносятся. Если rate содержит несколько записей со ссылкой на lot, то что хранит lot.id_user? P.S. Поле winner лучше переименовать в id_winner. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 18:17 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, Нет, lot.id_user - это id пользователя который разместил лот на сайте, а rate.id_user - это id пользователя разместившего ставку на лот. Таблицы соотносятся так: lot.id_user - user.id - id пользователя создавшего лот. Таблица rate содержит rate.id_lot - лот по которому сделана ставка, а rate.id_user - того, кто сделал ставку. По каждому лоту может быть несколько ставок от разных пользователей. Не могу разобраться со вложенными запросами. Сколько не читал, как понял, он выполняется и вписывает в свое место итог запроса. Что бы выполнился уже внешний запрос. Но как тогда мне нужно изменить запрос, что бы он выполнился? Как понять, что нужен именно вложенный запрос? Вы сказали, что у меня таблица user не соотносится из-за того, что используются INNER JOIN, но почему тогда все равно выводятся данные из таблицы user? Я пробовал другие типы JOINов и ничего не получалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 20:57 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
а почему вы не решаете проблему через SQL + PHP? имхо, это проще и читабельнее в смысле кода. потом будете читать вложенный запрос, ругаться. зачем? Логика такая: 1) находим лоты, где дата меньше текущей и победитель отсутствует, получаем массив объектов типа лот. (таблица lot) Цикл 2) для каждого лота из полученного массива находим id пользователя, сделавшего максимальную ставку по лоту. (таблица rate) 3) вытаскиваем данные по пользователю из таблицы user Конец цикла ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 22:20 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
1) Укажите точно версию MySQL. 2) Дайте пример наполнения таблиц, участвующих в процессе, в формате INSERT INTO. В теге SRC. 3) Дайте эталонный результат для именно такого наполнения - в теге Table (разделитель полей - запятая), с пояснением, почему именно так. Перед публикацией проверьте, что теги проставлены верно, кнопкой Просмотр. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 23:25 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67, Теперь вроде понятно полностью. Болванка вот такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Пришлось связываться через amount, что не очень хорошо, но другого простого выхода тут нет. Т.е. запрос должен вываливать id, имя юзера и его почту, без учета даты лота и значения поля winner. Я строго рекомендую руководствоваться общепринятыми неформальными правилами в именовании таблиц и полей: 1) Имена таблиц во множественном числе: lots, users, rates. Имена полей в единственном. 2) Не использовать служебные слова: user, date, name и т.д. 3) Не бойтесь использовать длинные (исчерпывающие) имена таблиц и полей. Когда-нибудь у вас из-за несоблюдения этих простых правил, особенно второго, очень крупно подгорит. Поэтому пока БД небольшая, лучше исправить. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2020, 23:35 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, Большое спасибо за рекомендации. Пишет Код: plsql 1.
Не смог полностью разобраться во вложенных запросах. Хотелось бы понять их логику. Вы можете порекомендовать литературу, для изучения этого вопроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 21:48 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
mini.weblab, Не хочется разделять один запрос на несколько частей. Не функционально. Хотелось поиск нужных данных полностью возложить на SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 21:50 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Akina, 1 MYSQL 5.7 x64 2 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
3 ну тут заполнение и так видно во 2 пункте. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 22:01 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67 Большое спасибо за рекомендации. Пишет #1054 - Неизвестный столбец 'r.id_user' в 'field list' Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Вы если данные приводите, приводите с ID, иначе нет смысла, при вставке теряется целостность данных. P.S. Литературы достаточно в сети. Просто гуглите и проделываете простое упражнение: прочитали материал - повторили то, что там написано. Набейте какую-нибудь тестовую базу и тренируйтесь. Есть очень неплохой сайт http://www.sql-ex.ru, там обучение в виде упражнений по темам от простейшего к сложному. Просто, полезно, и вы уже через несколько дней почувствуете рост уровня понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 22:36 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Проверяй: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Подробнее - тут: fiddle . Там же кое-какие пояснения. PS. Использовал версию 8, ибо 5.7 что-то не работает. Но никаких специфичных для 8+ конструкций там нет. offtop Gluck99 Есть очень неплохой сайт http://www.sql-ex.ru, там обучение в виде упражнений по темам от простейшего к сложному. Просто, полезно, и вы уже через несколько дней почувствуете рост уровня понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 22:49 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Gluck99, К сожалению выводит не правильный ответ. Есть лоты у которых срок действия не окончился еще ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2020, 16:07 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Akina, Судя по сайту fiddl Там вроде запрос верный. Но у меня он выводит данные с лотами, у которых еще не кончился срок действия. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2020, 16:09 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67 Gluck99, К сожалению выводит не правильный ответ. Есть лоты у которых срок действия не окончился еще ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2020, 17:16 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Нашел решение, пришлось глубже изучать язык, для более полного понимания. Всем спасибо. Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2020, 19:29 |
|
SQL запрос на вывод максимальной ставки сделанной пользователем по каждому лоту
|
|||
---|---|---|---|
#18+
Влад67 Код: sql 1.
Если в одной группе максимальный amount совпадет с не максимальным в другой, то тот тоже попадет в результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2020, 12:11 |
|
|
start [/forum/topic.php?fid=47&fpage=20&tid=1828544]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 160ms |
0 / 0 |