2015-04-29 2 views
1

У меня есть таблица offer_cpv, которая соединяет два других «offer» и «cpv». Вы можете увидеть скрипку здесь: http://sqlfiddle.com/#!9/02020/1Как отсортировать возвращенный результат sql по идентификатору, который появляется больше всего в этом результате

offer_cpv имеет две колонки, которые важны для нас: offer_id и cpv_id.

Моего исходный запрос выглядит следующим образом: SELECT cpv_id FROM offer_cpv WHERE offer_id IN (1,2,3,4) LIMIT 10

Как вы можете видеть, что я должен вернуть все cpv_id на основе массива offer_id (я прохожу, что WHERE IN (offer_id)

Я получу этот результат:.

cpv_id 
1010 
1020 
1030 
2010 
4030 
4060 
1010 
2010 
1010 
1020 

Как вы можете увидеть некоторые cpv_id повторяют, поскольку некоторые предложения могут иметь тот же cpv_id связаны с ними. Мне нужно, чтобы получить список «самых популярных» cpv_id, я имею в виду, если какой-то идентификатор repeati В большинстве случаев мне нужно, чтобы он был наверху списка. Например, это было бы желательно вывод:

cpv_id 
1010 
1020 
2010 
1030 
4030 
4060 

Как вы можете видеть, 1010 повторяется 3 раза, так что я хочу его на верхней части возвращенного результата. Затем наступает 1020 и 2010, так как они повторяются 2 раза, затем идут другие, пока не будет достигнут предел 10.

Можно ли как-то сделать с MYSQL и PHP?

Благодаря

ответ

4

Вам нужно count(*) и group by

SELECT cpv_id,count(*) as tot FROM offer_cpv 
WHERE offer_id IN (1,2,3,4) 
group by cpv_id 
order by tot desc 
LIMIT 10 

http://sqlfiddle.com/#!9/02020/3

+0

Спасибо, это работает как шарм. – offline

1

Вы можете использовать отчетливый, чтобы получить только уникальные значения. Вот ваш вопрос:

SELECT 
    distinct cpv_id 
FROM 
    offer_cpv 
WHERE 
    offer_id IN (1,2,3,4) 
LIMIT 10 
+0

Это не дает правильного результата. – offline

Смежные вопросы