2017-02-22 5 views
-1

Здравствуйте, у меня есть база данных mysql, в которой есть несколько категорий. Я хотел бы иметь возможность вытащить только первые 10 предметов для каждой категории, например:MySQL Выберите 10 лучших товаров по каждой категории

У меня есть следующая таблица, я бы хотел вытащить первые 2 строки для name = a, то же самое для name = b и name = с

----------------------------------- 
name | value | description | logo 
----------------------------------- 
a | 2.00 | its a letter| image 
----------------------------------- 
a | 5.00 | its a letter| image 
----------------------------------- 
b | 6.00 | its a letter| image 
----------------------------------- 
c | 3.00 | its a letter| image 
----------------------------------- 
c | 1.00 | its a letter| image 
------------------------------------ 

Это то, что я так фермой постфильтром является строкой объектов, приходит, когда сделан вызов. к сожалению, это только дает мне первые 10 из всех вместе, если вы можете указать мне в правильном направлении, что было бы здорово!

код:

SELECT * 
FROM object_list 
Where object IN (".$_POST['filter'].") 
ORDER BY date DESC, object ASC,id DESC 

ответ

1

ли эта работа?

SELECT 
    yourtable.* 
FROM 
    yourtable 
    JOIN (
     SELECT 
      t1.name, 
      t1.value, 
      COUNT(t2.name) AS theCount 
     FROM yourtable t1 
     LEFT JOIN yourtable t2 ON t1.name = t2.name AND t1.value > t2.value 
     WHERE t1.name in ('a', 'b') 
     GROUP BY t1.name, t1.value 
     HAVING theCount < 2 
    ) AS dt USING (name, value); 

Источник: http://thenoyes.com/littlenoise/?p=36

+0

Благодарим вас за ваш ответ! Я пробовал ваш код, но я не уверен, где я могу указать, например, для имен a и b? – paul590

+1

Дайте мне попробовать попробовать; без тестовых данных я не могу быть уверен, что это сработает. – miken32

+0

еще раз спасибо за вашу помощь, его почти там я могу получить некоторые результаты, к сожалению, кажется, что он не тянет то, что я ищу, кажется, что он тянет из верхней части списка, есть ли способ заставить его потянуть дно? – paul590

3

Вы можете получить группы вместе с элементом count по ниже запроса:

SELECT name, value, 
@count := IF(@value = name, @count + 1, 1) AS count, 
@value := name AS some_value 
FROM test, (SELECT @count := 1, @value := NULL) a 
WHERE test.name in ('a', 'b') 

Теперь, если вам нужно ограничить строки до 2 в группе, то вам просто необходимо перенести этот запрос в другой select и добавить критерии, например:

SELECT * 
FROM (
    SELECT name, value, 
    @count := IF(@value = name, @count + 1, 1) AS count, 
    @value := name AS some_value 
    FROM test, (SELECT @count := 1, @value := NULL) a 
    WHERE test.name in ('a', 'b')) a 
WHERE a.count <= 2; 

Вот SQL Fiddle.

+0

Спасибо за ваш комментарий, я тестировал на своем конце, и он почти отлично работает, я обнаружил, что если список не в порядке, и вы можете сказать, что 8 имен с последним разбросаны по таблице, вы получите группы из 2 в виде . – paul590

+1

Да, для этого нам нужно добавить 'order by'. Однако я не нашел ни одной колонки и, следовательно, не включил ее. Кроме того, для MySQL нет порядка сортировки по умолчанию, поэтому вам нужно иметь столбец, который вы можете «заказывать». –

+0

Удивительное спасибо! Его вытягивание информации, однако, тянет несколько групп из 2 для a и b, есть ли в любом случае, чтобы вытащить 2 из них? – paul590

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