2

各製品フィルター シナリオの次の 4 つのテーブルがあります。各製品には、複数の値を持つことができる複数の属性を含めることができます。

次のような複数の属性検索のユーザー要求の SQL クエリを作成するにはどうすればよいですか

CPU: >1000
Price <700

私の最後のJqueryは、パフォーマンスのために破損していました:

SELECT
  attributes_vals.*, handys.*
FROM
  handys join handy_has_vals on handys.id=handy_has_vals.handy_id 
  join attributes_vals on attributes_vals.id=handy_has_vals.val_id 
WHERE
  `attributes_vals`.`attr_id`=374 
  AND(`attributes_vals`.`vals` >=1000 AND `attributes_vals`.`vals` >=1500) 
  OR `attributes_vals`.`attr_id`=68  AND(`attributes_vals`.`vals`='YES')
  OR `attributes_vals`.`attr_id`=11  AND( `attributes_vals`.`vals` LIKE 'GPRS%')

フィドルとテスト: http://SQLFiddle.com/#!2/bba51/2

ここにテーブルがあります

handys
id  |   name    |   modell
1   |   Samsung |   galaxy A
2   |   Samsung |   galaxy B
3   |   Samsung |   galaxy C
4   |   Samsung |   galaxy D

handy_has_vals
handy_id    |   attr_id |   val_id
1           |   1       |   1
1           |   2       |   3
1           |   3       |   6
1           |   4       |   11
2           |   1       |   2
2           |   2       |   4
2           |   3       |   7
2           |   4       |   10
3           |   1       |   1
3           |   2       |   5
3           |   3       |   8
3           |   4       |   10
4           |   1       |   2
4           |   2       |   3
4           |   3       |   9
4           |   4       |   11

attributes_vals
id  |   attr_id |   vals
1   |   1       |   'YES'
2   |   1       |   'No'
3   |   2       |   '1200'
4   |   2       |   '1000'
5   |   2       |   '1500'
6   |   3       |   '300'
7   |   3       |   '350'
8   |   3       |   '800'
9   |   3       |   '550'
10  |   4       |   'YES'
11  |   4       |   'No'

attributes
id  |   attr_name
1   |   'GPS'
2   |   'CPU'
3   |   'Price'
4   |   'WLAN'
4

3 に答える 3

1

次のようになります。

SELECT * FROM handys h
INNER JOIN handy_has_vals hv ON h.id = hv.handy_id
INNER JOIN attributes a ON hv.attr_id = a.id
INNER JOIN attributes_vals av ON av.attr_id = a.id
WHERE ( a.attr_name = 'CPU' AND av.vals > '1000' ) or (  a.attr_name = 'Price' AND av.vals < '700' )

そして、文字列ではなく数値で比較するには、次のようにします。

SELECT * FROM handys h
INNER JOIN handy_has_vals hv ON h.id = hv.handy_id
INNER JOIN attributes a ON hv.attr_id = a.id
INNER JOIN attributes_vals av ON av.attr_id = a.id
WHERE ( a.attr_name = 'CPU' AND  cast(av.vals AS UNSIGNED) > '1000' ) or (  a.attr_name = 'Price' AND cast(av.vals AS UNSIGNED) < '700' )

ただし、CASTwhere 句で を使用すると、完全なテーブル スキャンが保証されるため、レコードが大量にある場合はパフォーマンスが大幅に低下します。

于 2013-01-25T10:32:47.463 に答える
0

このようにしてみてください

SELECT 
    attributes_vals . *, handys . *
from
    handys
        join
    handy_has_vals ON handys.id = handy_has_vals.handy_id
        join
    attributes_vals ON attributes_vals.id = handy_has_vals.val_id
WHERE
    ((attributes_vals.vals >= 1000 AND attributes_vals.vals >= 1500) 
           OR attributes_vals.vals = 'YES' OR attributes_vals.vals LIKE 'GPRS%')
于 2013-01-25T10:44:09.603 に答える
0

このクエリを試してください

SELECT 
    attributes_vals . *, handys . *
from
    handys
        join
    handy_has_vals ON handys.id = handy_has_vals.handy_id
        join
    attributes_vals ON attributes_vals.id = handy_has_vals.val_id
WHERE
    attributes_vals.attr_id IN (68, 11, 374)
    AND ((attributes_vals.vals >= 1000 AND attributes_vals.vals >= 1500) 
           OR attributes_vals.vals = 'YES' OR attributes_vals.vals LIKE 'GPRS%')
于 2013-01-25T10:37:52.313 に答える