我有一个规范化的数据库,其中高级表包含不同的产品和从属表特征。从属表通过外键链接到高级表。这意味着如果多个特征与产品的属性匹配,则从属表中可能会出现多个同一个characteristic_id(=外键),例如
Superior table (product_main_table):
product_id product_name
23 apple
24 orange
25 strawberry
Subordinate table (product_characteristics):
characteristic_id product_name characteristic
23 apple green
23 apple sweet
23 apple small
23 apple american
24 orange orange
24 orange sourly
24 orange big
24 orange african
25 strawberry red
25 strawberry sweet
我有一个html格式来读取数据,并且还应该有可能搜索所有与某些特征不匹配的产品。 但是,这不起作用。当我输入以下请求时:
SELECT DISTINCT main.product_name
FROM product_main_table main, product_characteristics prodchar
WHERE prodchar.characteristic != 'sweet'
结果是' apple',' orange'并且'草莓',它应该只是' orange'其他两种产品当然是选择的,因为它们具有除甜味之外的其他特性。被选中。
如果解决方案适合我的一般SQL请求
,我会非常高兴$sql = "SELECT DISTINCT $selection FROM $tabelle WHERE $masterarray";
其中$selection, $tabelle
和$masterarray
从html条目中获取其内容。
如果产品没有被选中,如果它包含一个不应该存在的单一特征,我如何制作我的where-statement?
答案 0 :(得分:0)
SET @characteristic='sweet,sour,bland';
...
WHERE FIND_IN_SET(prodchar.characteristic, @characteristic) = 0
或根据您要求的示例
$sql = "SET @characteristic='sweet,sour,bland';SELECT DISTINCT $selection FROM $tabelle WHERE FIND_IN_SET(prodchar.characteristic, @characteristic) = 0;";
如果需要,你也可以使用php字符串连接在你的变量中回显$ sql变量。
答案 1 :(得分:0)
我认为你可以使用NOT IN功能:
... WHERE prodchar.characteristic NOT IN (SELECT characteristic FROM product_characteristics WHERE name = main.product_name)
答案 2 :(得分:0)
你可以做一些像
这样的事情 SELECT DISTINCT prodchar.product_name
FROM product_characteristics prodchar
WHERE prodchar.product_name not in (select product_name from product_characteristics
where characteristic in ('sweet'))
http://sqlfiddle.com/#!9/ce6f6/7
性能不好,尝试使用联接。 Join vs. sub-query
答案 3 :(得分:0)
http://sqlfiddle.com/#!9/7fd63b/5
SELECT pmt.product_name
FROM product_characteristics pc
JOIN product_main_table pmt
ON pmt.product_id = pc.characteristic_id
GROUP BY characteristic_id
HAVING SUM(characteristic IN ('sweet'))=0