如果某些值与

时间:2016-10-19 18:14:33

标签: mysql

我有一个规范化的数据库,其中高级表包含不同的产品和从属表特征。从属表通过外键链接到高级表。这意味着如果多个特征与产品的属性匹配,则从属表中可能会出现多个同一个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?

4 个答案:

答案 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