복붙노트

[SQL] 각 카테고리에서 MYSQL 하나를 선택 랜덤 기록

SQL

각 카테고리에서 MYSQL 하나를 선택 랜덤 기록

나는 이런 식으로 뭔가를 보이는 항목 테이블이있는 데이터베이스가 :

id
name
category (int)

수십만 기록이있다. 각 항목은 카테고리 테이블에 대응하는 7 개 개의 다른 카테고리들 중 하나 일 수있다 :

id
category

나는 각 카테고리에서 1 개 임의 항목을 선택 쿼리를합니다. 뭐죠에 접근하는 가장 좋은 방법? 나는 랜드 ()와 유사한 임의 쿼리 1 조작 LIMIT에 의해 주문을 사용하는 알지만,이 같은 결코 완료 뭔가를했습니다.

해결법

  1. ==============================

    1.이 쿼리는 임의의 순서로 범주에 가입하는 모든 항목을 반환합니다 :

    이 쿼리는 임의의 순서로 범주에 가입하는 모든 항목을 반환합니다 :

    SELECT
    c.id AS cid, c.category, i.id AS iid, i.name
    FROM categories c
    INNER JOIN items i ON c.id = i.category
    ORDER BY RAND()
    

    일부 그룹에 의해 쿼리를 감싸, 하나에 각 범주를 제한하려면 :

    SELECT * FROM (
        SELECT
        c.id AS cid, c.category, i.id AS iid, i.name
        FROM categories c
        INNER JOIN items i ON c.id = i.category
        ORDER BY RAND()
    ) AS shuffled_items
    GROUP BY cid
    

    쿼리 BY 절 GROUP BY와 ORDER 모두이있는 경우, 그룹화 정렬하기 전에 수행합니다. 나는 두 개의 쿼리를 사용하는 이유이다 : 첫 번째는 결과, 두 번째 그룹 결과를 정렬합니다.

    나는이 쿼리는 어떤 인종 승리하지 않을 것으로 알고 있습니다. 나는 제안에 열려입니다.

  2. ==============================

    2.여기서 단순한 솔루션이다. 이 테이블이 있다고 가정하자.

    여기서 단순한 솔루션이다. 이 테이블이 있다고 가정하자.

    id  name    category
    1   A       1
    2   B       1
    3   C       1
    4   D       2
    5   E       2
    6   F       2
    7   G       3
    8   H       3
    9   I       3
    

    이 쿼리를 사용하여

    select
      c.id,
      c.category,
      (select name from category where category = c.category   group by id order by rand() limit 1) as CatName
    from category as c
    group by category
    
  3. ==============================

    3.이 시도

    이 시도

    SELECT id, name, category from Items where
    ( 
     select count(*) from Items i where i.category = Items.category 
     GROUP BY i.category ORDER BY rand()
    ) <= 1
    

    REF : http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

  4. ==============================

    4.참고 : 다음 예제 난 당신이 또한 다른 테이블 "범주"(대문자로하지 두 번째 테이블 이름)라는 이름의 한 말했기 때문에 테이블이 없습니다 "항목" "항목"라는 가정입니다.

    참고 : 다음 예제 난 당신이 또한 다른 테이블 "범주"(대문자로하지 두 번째 테이블 이름)라는 이름의 한 말했기 때문에 테이블이 없습니다 "항목" "항목"라는 가정입니다.

    당신이 대략 것 수행 할 작업에 대한 SQL :

    `SELECT items.id AS item_id,
    items.name AS item_name,
    items.category AS item_category_id,
    categories.id AS category_id,
    categories.category AS category_name
    FROM items, category
    WHERE items.category = categories.id
    ORDER BY rand()
    LIMIT 1`
    
  5. from https://stackoverflow.com/questions/14245275/mysql-select-one-random-record-from-each-category by cc-by-sa and MIT license