Php 如何从复杂的SQL查询中筛选结果?
我有这样一个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
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