помогите плиз с запросом бд состоит из двух столбцов slovo и data надо вывести последние 10 уникальных значений slovo и посчитать сколько раз оно повторялось желательно до момента определения этих 10 значений возможно немного по другому грубо говоря это запись того что ищет пользователь. хотелось бы понимать как меняются приоритеты со временем Код (Text): SELECT COUNT( * ) AS `stroki` , `slovo` FROM history GROUP BY `slovo` ORDER BY `data` DESC LIMIT 0 , 10 данный запрос, работает слегка не корректно, как я понимаю он сперва группирует,понимает и запоминает первую дату переменных одинаковых и по ним сортирует, а надо чтоб не первую а последнюю дату запоминал и вывод был по последней дате заранее спасибо Добавлено спустя 12 минут 23 секунды: вопрос еще такой, данную задачу лучше решать через майскл или все таки делать запрос попроще (выборку данных) запись в массив и анализ уже средствами пхп?
Подзапрос поможет. Код (Text): SELECT hg.* FROM ( SELECT `slovo`, MAX(`data`) AS `max_data`, COUNT(*) AS `slovo_count` FROM `history` GROUP BY `slovo` ) AS hg ORDER BY hg.`max_data` DESC LIMIT 10 Добавлено спустя 6 минут 9 секунд: P.S. использовать транслитерацию русского вперемешку с английским, это отвратительно! Добавлено спустя 3 минуты 54 секунды: Обработку множеств должен делать SQL сервер, он для этого предназначен. Именно это "ПОПРОЩЕ". Когда познакомишся с SQL получше, ты увидишь как он прост и выразителен: пишешь буквально предложение что хочешь сделать, не задумываясь как это сделать. Задача PHP вывести результат в удобном виде.
спасибо за оперативность да запрос работает так как нужно подскажите, а можно его еще чутка подправить, если да то как выбрать из выводимых минимальную max_data и slovo_count считать только до этого значения? если такой запрос реально сделать то это будет просто супер заранее спасибо
я понимаю что вы из лучших побуждений, со сложными запросами . почти не работал, что т не соображу как, плиз подскажите что не пробую ерунда какая то получается даже просто вывод минимального значения из выбранных средствами mysql не получается Добавлено спустя 1 минуту 1 секунду: а как лучше? Добавлено спустя 15 минут 15 секунд: ну да делает тоже самое Добавлено спустя 2 минуты 27 секунд: остается вопрос можно ли и как выбрать из выводимых минимальную max_data и slovo_count считать только до этого значения? Добавлено спустя 47 минут 59 секунд: я так понимаю должно быть что то типо: Код (Text): SELECT `slovo` , MAX( `data` ) AS `max_data1` , COUNT( * ) AS `slovo_count1` FROM history WHERE data > ( SELECT MIN( hg.`max_data` ) AS `min_data` FROM ( SELECT MAX( `data` ) AS `max_data` FROM `history` GROUP BY `slovo` ORDER BY `max_data` DESC LIMIT 0 , 10 ) AS hg ORDER BY hg.`max_data` DESC ) GROUP BY `slovo` ORDER BY `max_data1` DESC LIMIT 0 , 10 все работает Добавлено спустя 39 секунд: или это уже изврат ? Добавлено спустя 5 минут 23 секунды: можно ли сделать проще? и вопрос стоит ли делать такие большие и сложные запросы или стоит разделять? может кто по опыту работы с большими бд подскажет?
Чушкин, "тайный смысл" в том, чтобы помочь топикстартеру разобраться. И это уже работает. Не стоит оптимизировать то, что непонятно. Надо сначала добиться результата. Добавлено спустя 5 минут 36 секунд: ацбир, есть определенные ограничения в использовании LIMIT внутри подзапросов. ты погоняй всякие варианты в phpmyadmin или что ты там используешь чтобы набраться опыта. всегда есть несколько вариантов решения. пробуй сам, не спрашивай раньше чем попробуешь.
ну да пхп админ, с него то первоначальный запрос и получал и тестил в нем у меня просто познаний малек маловато, являюсь самоучкой, и кроме программинга очень много других задач не всегда есть время разбираться но самое плохое, поскольку задачи встречаются сложные не так часто, тот опыт что накапливается частенько теряется и часто приходиться вникать с самого начала поэтому про разные варианты могу и не знать поэтому и спрашиваю, бд будет большая, пока решения хватит конечно, бум тогда решать вопрос по мере необходимости и еще раз огромное спасибо за быструю реакцию, когда есть направление это всегда хорошо
с лимитами спс, подправил на 1 меньше выводило а вопросы: можно ли сделать проще, быстрее? стоит ли делать такие большие и сложные запросы или стоит разделять? особенно если будет большая бд вроде на 3 миллионах проверил часть запроса ( расчет минимального значения 0,0006 сек) по идее должно быть все ок, но мало ли просто раньше те с кем общался всегда советовали избегать сложных запросов, говорили что на больших бд лучше несколько простых запросов, чем один сложный
Используй команду EXPLAIN чтобы оценить сложность запроса. Сам по себе под-запрос не ухудшает план выполнения. Производительность зависит от использования индексов и доступной оперативной памяти. Общее правило оптимизации запросов: надо попытаться отсечь максимум ненужных данных как можно раньше. "Тайный смысл подзапросов" еще и в том, что глядя на него ты четко видишь: сначала выполняется вот это действие, потом вот это. В "плоском" варианте это не всегда очевидно. И еще: сервер умеет кешировать результаты. Поэтому даже очень "тяжелый" запрос будет выполняться быстро при повторном вызове, если присутствующие в запросе таблицы не изменялись.
спасибо за консультацию вопрос, если изменения незначительные, например как у меня таблица два столбца, записи только дописываются в конце то одна запись в конце таблицы = полный анализ бд по новой? или учитывается что добавлена строка, в конце? и обработка проще и быстре? Добавлено спустя 36 минут 40 секунд: ммм что то я рано радовался с limit действительно беда и что то я не пойму в чем именно заморочка