За последние 24 часа нас посетили 10035 программистов и 439 роботов. Сейчас ищут 146 программистов ...

Вывести топ 10 наиболее часто встречающихся записей

Тема в разделе "MySQL", создана пользователем denism300, 20 мар 2017.

  1. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    Есть таблица вида: id, product, user
    id - уникальное значение
    product и user - нет, но для одного и того же product значения user не могут быть одинаковыми.

    собственно, вопрос: как вывести 10 наиболее часто встречающихся записей product и посчитать сколько раз встречается каждая запись?
     
  2. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.792
    Симпатии:
    784
    группирующие запросы. Что-то вроде
    Код (Text):
    1. select count(user_id), product_id from table_name group by product_id;
     
    denism300 нравится это.
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    10.824
    Симпатии:
    1.383
    Адрес:
    :сердА
    У count(user_id) прописать алиас
    Дописать еще ORDER BY по этому алиасу
    Дописать LIMIT 0,10
     
    denism300 нравится это.
  4. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    Все получилось, спасибо! Но возник такой вопрос: выборку делаю из двух таблиц. В первой хранится информация о товарах и пользователях, их купивших, во второй картинки товаров. У каждого товара может быть одна, несколько или ни одной картинки.
    запрос сделал такой:
    PHP:
    1. select count(a.user_id) as uid, a.product_id, b.img_url
    2. from table_prod as a
    3. left join table_img as b
    4. on b.product_id = a.product_id
    5. group by a.product_id
    6. order by uid
    7. limit 0, 10;
    и теперь, если у товара больше одной картинки, то итоговое количество становится равным количеству пользователей умноженным на количество картинок, т.е. если товар купило 2 человека и у него 3 картинки, то запрос выдаст результат 6.
    как поправить?
     
  5. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    еще такой момент: в таблице table_img есть поле is_main, которое содержит значения 1 - если это главное изображение товара и 0, если не главное.
    но если добавить условие
    Код (Text):
    1. where b.is_main = 1
    то, соответственно, товары без изображений не учитываются.
     
  6. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    46
    Симпатии:
    14
    делайте группировку до join (т.е. в подзапросе)
     
  7. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    не понимаю, как это сделать.. подскажите, пожалуйста
     
  8. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    46
    Симпатии:
    14
    ... from (исодный запрос) as a
    left join table_img as b ...
     
  9. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    еще больше не понял. как это - from (исходный запрос) as a?
     
  10. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    46
    Симпатии:
    14
    в качестве таблицы может быть подзапрос
    емнип, называется это производная таблица
     
  11. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    сделал так:
    PHP:
    1. select count(a.user_id) as uid, a.product_id, b.img_url
    2. from (select a.user_id, a.product_id from table_prod as a group by a.product_id)  as a
    3. left join table_img as b
    4. on b.product_id = a.product_id
    5. group by a.product_id
    6. order by uid
    7. limit 0, 10;
    результат тот же.
    подскажите, как сделать - реально уже запутался.
     
  12. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    46
    Симпатии:
    14
    https://dev.mysql.com/doc/refman/5.7/en/derived-tables.html

    разве то, что у вас сейчас в подзапросе определяет 10 наиболее часто встречающихся записей product и считает сколько раз встречается каждая запись?
    у вас есть исходный запрос, который выводит некий результат, по сути таблица. и теперь к этой таблице нужно сделать join картинок
     
    denism300 нравится это.
  13. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    все, разобрался. в итоге получилось так:
    PHP:
    1. select uid, a.product_id, b.img_url
    2. from (select count(a.user_id) as uid, a.product_id from table_prod as a group by a.product_id)  as a
    3. left join table_img as b
    4. on b.product_id = a.product_id
    5. group by a.product_id
    6. order by uid
    7. limit 0, 10;
     
  14. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    46
    Симпатии:
    14
    судя по всему не разобрались.
    зачем вам дважды группировка? и order + limit снаружи?

    у вас есть запрос определяющий 10 наиболее часто встречающихся записей product и сколько раз встречается каждая запись. назовем его исходный.
    поместите этот результат во вспомогательную таблицу test
    затем присоедините картинки ... from test as a left join table_img as b ...
    теперь в последнем запросе замените test на (исходный запрос) и получится нужный вам запрос
     
  15. denism300

    denism300 Новичок

    С нами с:
    25 фев 2016
    Сообщения:
    38
    Симпатии:
    4
    если убрать группировку снаружи и сортировку перенести во внутреннюю таблицу, то он выводит результат для каждой картинки и не сортирует по uid.
    делал так:
    Код (Text):
    1. select uid, a.product_id, b.img_url
    2. from (select count(a.user_id) as uid, a.product_id from table_prod as a group by a.product_id order by uid limit 0, 10)  as a
    3. left join table_img as b
    4. on b.product_id = a.product_id