За последние 24 часа нас посетили 8874 программиста и 836 роботов. Сейчас ищут 366 программистов ...

последние 10 записей, с подсчетом повторов

Тема в разделе "MySQL", создана пользователем acbir, 29 мар 2015.

  1. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    помогите плиз с запросом
    бд состоит из двух столбцов slovo и data
    надо вывести последние 10 уникальных значений slovo и посчитать сколько раз оно повторялось желательно до момента определения этих 10 значений
    возможно немного по другому
    грубо говоря это запись того что ищет пользователь.
    хотелось бы понимать как меняются приоритеты со временем
    Код (Text):
    1. SELECT COUNT( * ) AS `stroki` , `slovo` FROM history GROUP BY `slovo` ORDER BY `data` DESC LIMIT 0 , 10
    данный запрос, работает слегка не корректно, как я понимаю он сперва группирует,понимает и запоминает первую дату переменных одинаковых и по ним сортирует, а надо чтоб не первую а последнюю дату запоминал
    и вывод был по последней дате
    заранее спасибо

    Добавлено спустя 12 минут 23 секунды:
    вопрос еще такой, данную задачу лучше решать через майскл или все таки делать запрос попроще (выборку данных) запись в массив и анализ уже средствами пхп?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.818
    Симпатии:
    1.171
    Адрес:
    там-сям
    Подзапрос поможет.
    Код (Text):
    1. SELECT hg.*
    2. FROM
    3. (
    4.   SELECT `slovo`, MAX(`data`) AS `max_data`, COUNT(*) AS `slovo_count`
    5.   FROM `history`
    6.   GROUP BY `slovo`
    7. ) AS hg
    8. ORDER BY hg.`max_data` DESC
    9. LIMIT 10
    Добавлено спустя 6 минут 9 секунд:
    P.S. использовать транслитерацию русского вперемешку с английским, это отвратительно!

    Добавлено спустя 3 минуты 54 секунды:
    Обработку множеств должен делать SQL сервер, он для этого предназначен. Именно это "ПОПРОЩЕ". Когда познакомишся с SQL получше, ты увидишь как он прост и выразителен: пишешь буквально предложение что хочешь сделать, не задумываясь как это сделать.

    Задача PHP вывести результат в удобном виде.
     
  3. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    спасибо за оперативность
    да запрос работает так как нужно
    подскажите, а можно его еще чутка подправить, если да то как
    выбрать из выводимых минимальную max_data и slovo_count считать только до этого значения?
    если такой запрос реально сделать то это будет просто супер
    заранее спасибо
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.818
    Симпатии:
    1.171
    Адрес:
    там-сям
    можно - подправь
     
  5. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Вопрос: зачем там подзапрос? В чём тайный смысл?
     
  6. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    я понимаю что вы из лучших побуждений, со сложными запросами . почти не работал, что т не соображу как, плиз подскажите
    что не пробую ерунда какая то получается
    даже просто вывод минимального значения из выбранных средствами mysql не получается :(

    Добавлено спустя 1 минуту 1 секунду:
    а как лучше?

    Добавлено спустя 15 минут 15 секунд:
    ну да
    делает тоже самое :)

    Добавлено спустя 2 минуты 27 секунд:
    остается вопрос
    можно ли и как
    выбрать из выводимых минимальную max_data и slovo_count считать только до этого значения?


    Добавлено спустя 47 минут 59 секунд:
    я так понимаю должно быть что то типо:
    Код (Text):
    1. SELECT `slovo` , MAX( `data` ) AS `max_data1` , COUNT( * ) AS `slovo_count1`
    2. FROM history
    3. WHERE  data > (
    4. SELECT MIN( hg.`max_data` ) AS `min_data`
    5. FROM (
    6.  
    7. SELECT MAX( `data` ) AS `max_data`
    8. FROM `history`
    9. GROUP BY `slovo`
    10. ORDER BY `max_data` DESC
    11. LIMIT 0 , 10 ) AS hg
    12. ORDER BY hg.`max_data` DESC
    13. )
    14. GROUP BY `slovo`
    15. ORDER BY `max_data1` DESC
    16. LIMIT 0 , 10
    все работает :)

    Добавлено спустя 39 секунд:
    или это уже изврат :) ?

    Добавлено спустя 5 минут 23 секунды:
    можно ли сделать проще?
    и вопрос стоит ли делать такие большие и сложные запросы или стоит разделять?
    может кто по опыту работы с большими бд подскажет?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.818
    Симпатии:
    1.171
    Адрес:
    там-сям
    Чушкин, "тайный смысл" в том, чтобы помочь топикстартеру разобраться. И это уже работает.
    Не стоит оптимизировать то, что непонятно. Надо сначала добиться результата.

    Добавлено спустя 5 минут 36 секунд:
    ацбир, есть определенные ограничения в использовании LIMIT внутри подзапросов. ты погоняй всякие варианты в phpmyadmin или что ты там используешь чтобы набраться опыта. всегда есть несколько вариантов решения. пробуй сам, не спрашивай раньше чем попробуешь.
     
  8. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    ну да пхп админ, с него то первоначальный запрос и получал
    и тестил в нем
    у меня просто познаний малек маловато, являюсь самоучкой, и кроме программинга очень много других задач :( не всегда есть время разбираться :( но самое плохое, поскольку задачи встречаются сложные не так часто, тот опыт что накапливается :( частенько теряется :( и часто приходиться вникать с самого начала :(
    поэтому про разные варианты могу и не знать :(
    поэтому и спрашиваю, бд будет большая, пока решения хватит конечно, бум тогда решать вопрос по мере необходимости
    и еще раз огромное спасибо за быструю реакцию, когда есть направление это всегда хорошо :)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.818
    Симпатии:
    1.171
    Адрес:
    там-сям
    И в чем вопрос сейчас?
     
  10. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    с лимитами спс, подправил на 1 меньше выводило
    а вопросы:
    можно ли сделать проще, быстрее?
    стоит ли делать такие большие и сложные запросы или стоит разделять?

    особенно если будет большая бд
    вроде на 3 миллионах проверил часть запроса ( расчет минимального значения 0,0006 сек)
    по идее должно быть все ок, но мало ли
    просто раньше те с кем общался всегда советовали избегать сложных запросов, говорили что на больших бд лучше несколько простых запросов, чем один сложный
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.818
    Симпатии:
    1.171
    Адрес:
    там-сям
    Используй команду EXPLAIN чтобы оценить сложность запроса. Сам по себе под-запрос не ухудшает план выполнения. Производительность зависит от использования индексов и доступной оперативной памяти.

    Общее правило оптимизации запросов: надо попытаться отсечь максимум ненужных данных как можно раньше. "Тайный смысл подзапросов" еще и в том, что глядя на него ты четко видишь: сначала выполняется вот это действие, потом вот это. В "плоском" варианте это не всегда очевидно.

    И еще: сервер умеет кешировать результаты. Поэтому даже очень "тяжелый" запрос будет выполняться быстро при повторном вызове, если присутствующие в запросе таблицы не изменялись.
     
  12. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    спасибо за консультацию
    вопрос, если изменения незначительные, например как у меня таблица два столбца, записи только дописываются в конце
    то одна запись в конце таблицы = полный анализ бд по новой? или учитывается что добавлена строка, в конце? и обработка проще и быстре?

    Добавлено спустя 36 минут 40 секунд:
    ммм что то я рано радовался
    с limit действительно беда и что то я не пойму в чем именно заморочка
     
  13. acbir

    acbir Новичок

    С нами с:
    4 фев 2015
    Сообщения:
    30
    Симпатии:
    0
    мм все норм :) кой что не досмотрел еще раз спс за помощь :)