2014-02-17 3 views
1

Приношу свои извинения. Я отредактировал это ниже в 2 таблице, я просто немного путаю.MySQL - выбор одной записи для каждой категории


У меня есть таблицы очень похожи, как те ниже, и я хотел, чтобы показать все table2 класса 1, но только один случайный элемент на каждый table1-категории

Образец Item Table1

 
+---------+---------------+---------------+ 
| ID | Item Name | Category | 
+---------+---------------+---------------+ 
| 01 | Item A  |  Cat 1  | 
| 02 | Item B  |  Cat 1  | 
| 03 | Item C  |  Cat 2  | 
| 04 | Item D  |  Cat 2  | 
| 05 | Item E  |  Cat 3  | 
| 06 | Item F  |  Cat 3  | 
+---------+---------------+---------------+ 

образец Item Table2

 
+---------------+---------------+ 
| Category |  Class  | 
+---------------+---------------+ 
|  Cat 1  |  1  | 
|  Cat 2  |  1  | 
|  Cat 3  |  2  | 
+---------------+---------------+ 

Я хотел показать все table2 класса 1, но только 1 случайный элемент в каждой table1-категории

Желаемая Result

 
+---------+---------------+---------------+ 
| 02 | Item B  |  Cat 1  | 
| 03 | Item C  |  Cat 2  | 
+---------+---------------+---------------+ 

(Это в моем PHP скрипт)

Заранее спасибо

+0

возможно дубликат [Получить Top N записей для каждой группы сгруппированных результатов] (http://stackoverflow.com/questions/12113699/get-top- н-запись-в-каждый-гр oup-of-grouped-results) –

+0

Посмотрите на функцию 'RAND', используя' GROUP BY' https://dev.mysql.com/doc/refman/5.0/en/mathematics-functions.html#function_rand – Mihai

+0

Спасибо Marc B. На самом деле моя разновидность различна, весь мой сценарий: у меня есть инвентарь (SQL); Я использовал 2 серийных номера, номер позиции и номер категории. У меня около 1000 предметов и около 750 категорий. Мне нужно сделать цикл в PHP, чтобы отобразить всю категорию, и мне нужно отобразить случайный элемент для каждой категории. Я не думаю, что могу использовать «UNION ALL» ..и да, изменение формата инвентаризации не является опцией – vise

ответ

3

Вы можете сделать что-то вроде этого

SELECT t.id, itemname, category 
    FROM 
(
    SELECT 
    (
    SELECT id 
     FROM table1 
    WHERE category = t.category 
    ORDER BY RAND() 
    LIMIT 1 
) id 
    FROM table1 t 
    GROUP BY category 
) q JOIN table1 t 
    ON q.id = t.id 

Примечание: использованием RAND() является очень дорогостоящим

Выход:

 
| ID | ITEMNAME | CATEGORY | 
|----|----------|----------| 
| 1 | Item A | Cat 1 | 
| 3 | Item C | Cat 2 | 
| 6 | Item F | Cat 3 | 

Вот SQLFiddle демо

+0

Привет, Питер, это выглядит отлично! Я попробую это и опубликую обновление позже. Огромное спасибо! – vise

+0

Удивительный! который работает как шарм, даже если он не присоединится ко второму столу. –

0

Попробуйте что-то вроде этого:

SELECT id, itemname, category FROM (
    SELECT id, itemname, category FROM sample_table 
    ORDER BY RAND() 
) AS tmp 
GROUP BY category 

Обратите внимание, что этот запрос является полностью действительным в MySQL http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

+0

Это зависит от группы MySQL по расширениям, которые явно задокументированы как небезопасные: http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html. –

+0

Он немного похож на Peterm. Я хочу придерживаться решения Peterm. Спасибо в любом случае – vise

0

Самый безопасный способ сделать это с коррелированным подзапросом. Чтобы получить item_id:

select category, 
     (select item_id from sample s where s2.category = s.category order by rand() limit 1) as item_id 
from sample s 
group by category; 

Чтобы получить остальную часть информации о товаре, присоединиться к этой назад в:

select s.* 
from (select category, 
      (select item_id from sample s where s2.category = s.category order by rand() limit 1) as item_id 
     from sample s 
     group by category 
    ) c join 
    sample s 
    on s.item_id = c.item_id; 
+0

Привет, я думаю, это тоже будет работать, но я хочу придерживаться решения Peterm. Спасибо, в любом случае – vise

0

До над редакцией сценария, я использовал ниже запрос, и он работает отлично, за исключением что он не рандомизации записи каждой категории:

SELECT * FROM Table1,Table2 
WHERE Table2.Class = '1' 
AND Table1.Category = Table2.Category 
GROUP BY Table1.Category ORDER BY RAND() 
Смежные вопросы