sql >> データベース >  >> RDS >> Mysql

ファセット検索の属性数

    これを行う方法は次のとおりです。

    SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
      FROM meta m JOIN item_meta im
        ON im.field_id = m.id
     GROUP BY meta_name, meta_value
    

    出力:

    |      META_NAME | META_VALUE | COUNT |
    |----------------|------------|-------|
    |       Car Type |      Coupe |     2 |
    |       Car Type |      Sedan |     1 |
    |          Color |      Black |     1 |
    |          Color |        Red |     1 |
    |          Color |      White |     1 |
    | Interior Color |      Black |     2 |
    | Interior Color |       Grey |     1 |
    |           Make |        BMW |     2 |
    |           Make |      Honda |     1 |
    |          Model |    2Series |     1 |
    |          Model |    3Series |     1 |
    |          Model |      Civic |     1 |
    

    こちらが SQLFiddle です。 デモ

    更新:

    フィルタリング:

    SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
      FROM meta m JOIN item_meta im
        ON im.field_id = m.id
     WHERE item_id IN
    (
      SELECT i.id
      FROM item_meta im JOIN items i
        ON im.item_id = i.id JOIN meta m
        ON im.field_id = m.id
     GROUP BY i.id
    HAVING MAX(meta_name = 'Make' AND meta_value = 'BMW') = 1
       AND MAX(meta_name = 'Car Type' AND meta_value = 'Coupe') = 1
    )
     GROUP BY meta_name, meta_value;
    

    出力:

    |      META_NAME | META_VALUE | COUNT |
    |----------------|------------|-------|
    |       Car Type |      Coupe |     2 |
    |          Color |      Black |     1 |
    |          Color |      White |     1 |
    | Interior Color |      Black |     1 |
    | Interior Color |       Grey |     1 |
    |           Make |        BMW |     2 |
    |          Model |    2Series |     1 |
    |          Model |    3Series |     1 |
    

    こちらが SQLFiddle です。 デモ

    UPDATE2:

    簡単です。当然、ANDを使用する代わりに HAVING 句(車を同時に黒と赤にすることはできません)ORを使用する必要があります そのように

    HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') = 1
        OR MAX(meta_name = 'Color' AND meta_value = 'Red')   = 1
    

    または、同じ意図を表現する別の方法があります

    HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') +
           MAX(meta_name = 'Color' AND meta_value = 'Red') > 0
    

    こちらが SQLFiddle です。 デモ



    1. 動的マルチレベルメニューphpの再帰関数

    2. MySQLにパスワードを安全に保存し、外部サービスに対して認証するにはどうすればよいですか?

    3. RPMプラットフォームでPostgreSQL9.0拡張機能を構築しない方法

    4. MySQLDBへの動的SQLクエリの作成