Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从复杂的SQL查询中筛选结果?_Php_Sql_Subquery_Filtering - Fatal编程技术网

Php 如何从复杂的SQL查询中筛选结果?

Php 如何从复杂的SQL查询中筛选结果?,php,sql,subquery,filtering,Php,Sql,Subquery,Filtering,我有这样一个sql查询: SELECT `categories`.`partnumbersafe`, `filters`.`filtername`, `filters`.`filtervalue` FROM `products_categories` AS `categories` LEFT OUTER JOIN `products` AS `product` ON `categories`.`partnumbersafe` = `product`.`partnumbersa

我有这样一个sql查询:

SELECT  `categories`.`partnumbersafe`, `filters`.`filtername`,  `filters`.`filtervalue` 
FROM  `products_categories` AS  `categories` 
LEFT OUTER JOIN  `products` AS  `product` ON  `categories`.`partnumbersafe` =  `product`.`partnumbersafe` 
LEFT OUTER JOIN  `products_filters` AS  `filters` ON  `categories`.`partnumbersafe` =  `filters`.`partnumbersafe` 
WHERE  `categories`.`categoryid` =4
AND (`product`.`visibility` =1 OR  `product`.`visibility` =2)
AND  `product`.`status` =1
这给出了一个结果,其中有多个partnumbersafe条目(相同的值)具有不同的filtername和filtervalue。例如:

partnumbersafe   filtername   filtervalue

123                brand        toyota
123                model        F5
123                type         business
678                brand        toyota
678                model        F6
查询是由PHP生成的。我的PHP脚本中也有包含filterdata的POST值(例如品牌是toyota,型号是F6)

如何筛选筛选名称/值对的这些结果?我更喜欢sql查询解决方案而不是php解决方案,在这里我可以查询partnumbersafe,其中品牌是丰田,型号是F6。因此,它只能检索上表中的零件号SAFE 123


“表产品”过滤器保存上面的表大纲所表示的所有数据。

此处需要有多个条件。每个
partnumbersafe
的记录数等于您提供的条件数

SELECT partnumbersafe
FROM...
WHERE (filterName = 'Brand' AND filtervalue = 'toyota')
        OR
      (filterName = 'Model' AND filtervalue = 'F6')
GROUP BY partnumbersafe
HAVING COUNT(*) = 2

这假设您只需要
partnumbersafe
,并且
filtername
/
filtervalue
对不会多次应用于同一
partnumbersafe

谢谢John,您能详细说明一下吗?您的意思是从上述查询中整体选择?或者将其添加到查询中,如图所示。在后一种情况下,将不会有结果,因为表中没有包含这两个值的行,这些值分布在多个行中。基本上,这是您需要的查询。用原始的
FROM
子句替换
FROM…
。确保在列中包含表名或
别名
,以避免歧义错误。@MarcBuurke-这与我的答案相同。它首先查找带有
'Brand'、'Toyota'
'Model'、'F6'
的行。然后它按
PartNumberSafe
值分组,但只返回组中有2个源行的结果。这意味着您现在有一个
PartNumberSafe
列表,其中既有一个
'Brand','Toyota'
行,又有一个
'Model','F6'
行…除了@Dems comment之外,
HAVING COUNT(*)=2
被添加到只过滤结果中有两个实例的行,因为它同时匹配两个耦合条件。另外,由于这些过滤器,您不需要
左连接
,您只需使用
内部连接
-没有过滤器记录的任何内容都将被
WHERE
子句排除…Dems,如果我还需要每个查询的filtername品牌值,这可能吗?你能在你的问题中给出一个例子吗?基本上我想返回品牌的filters.filtervalue以及零件号safe。选择
类别
零件号安全
过滤器。过滤器值
来自。。。。其中
过滤器
过滤器名称
='BRAND'@MarcBuurke-通用方法是将这些结果连接回零件表,并将其用作子查询<代码>从(queryFromAnswer)中选择*作为子查询左连接产品\u作为子查询上的过滤器过滤。partnumbersafe=filter.partnumbersafe和filter.filtername='Brand'
SELECT
  `categories`.`partnumbersafe`
FROM
  `products_categories` AS  `categories` 
LEFT OUTER JOIN
  `products`            AS  `product`
    ON  `categories`.`partnumbersafe` = `product`.`partnumbersafe` 
LEFT OUTER JOIN
  `products_filters`    AS  `filters`
    ON  `categories`.`partnumbersafe` = `filters`.`partnumbersafe` 
WHERE
     `categories`.`categoryid` = 4
AND (`product`.`visibility` =1 OR  `product`.`visibility` =2)
AND  `product`.`status` =1
AND
(
  (`filters`.`filtername` = 'Brand' AND `filters`.`filtervalue` = 'Toyota')
  OR
  (`filters`.`filtername` = 'Model' AND `filters`.`filtervalue` = 'F6')
)
GROUP BY
  `categories`.`partnumbersafe`
HAVING
  COUNT(*) = 2