好吧,我不会在这里发帖,直到我花了几天时间试着自己解决这个问题。
这是非常困难的。我会非常惊讶,也会对解决这个问题的人感到敬畏。
还要注意:我是用PHP来做这件事的,并不关心我需要做多少查询或循环才能做到这一点。因此,如果有多个查询或php循环可以提供帮助,请务必提出建议。谢谢
更新:为了简化这一点,如果你可以用像%catFilter.value%这样的availMetals来解决它,我想它会更容易。
我可以使用PHP循环来完成剩下的工作。
感谢那些花时间去看的人。
我有3个表,其中包含以下字段:
catFilter - (id, catTypeId, value)
products - (id, availMetals)
prodFilter - (id, catFilterId, productId)和下面的关系
products.id = prodFilter.productId
catFilter.id = prodFilter.catFilterId我需要获取三个数据作为最终结果:
catFilter.id (also could be prodFilter.catFilterId)
catFilter.value到目前为止我能让那两个。我需要第三个..
A COUNT OF .. All Products who have an availMetals like
of %White Gold% and also has catTypeId = 1下面是最终列表的样子。
catFilter.value -产品计数
classic - 0
rings - 0
sets - 1
stones - 5
three - 0
halo - 3等等。等等。
以下是表的一些示例数据
products
id - availMetals
111 - White Gold
112 - White Gold, Yellow Gold
113 - White Gold
114 - White Gold
115 - White Gold
116 - White Gold, Platinum, Palladium
prodFilter
productId - catFilterId
111 - 43
111 - 12
111 - 48
111 - 47
112 - 12
112 - 51
112 - 48
113 - 12
113 - 51
113 - 48
114 - 12
114 - 51
114 - 48
115 - 12
115 - 48
116 - 12
116 - 51
catFilter
id - catTypeId - value
1 - 1 - Classic
50 - 1 - Rings
47 - 1 - Sets
48 - 1 - Stones
49 - 1 - Three
51 - 1 - Halo发布于 2012-02-09 17:11:35
尝试如下所示:
SELECT cf.id, cf.value, COUNT(p.id)
FROM catFilter cf
INNER JOIN prodFilter pf ON pf.catFilterId = cf.id
INNER JOIN products p ON p.id = productId
WHERE cf.catTypeId = 1 AND p.availMetals LIKE CONCAT('%', cf.value, '%')
GROUP BY cf.id发布于 2012-02-09 17:25:21
这样就行了吗?
select cf.id, cf.value,
sum(if(cf.catTypeId = 1 and p.availMetals like concat('%', cf.value, '%')
= 1, 1, 0)) as FinalCount
from catFilter cf
join prodFilter pf on cf.id = pf.catFilterId
join products p on pf.productId = p.id
group by cf.id, cf.value编辑:
根据提供的数据,应该没有匹配的数据,对吧?因为p.availMetals like concat('%', cf.value, '%')总是假的。让我们强制它。更改此记录:
prodFilter
productId | catFilterId
111 | 43对于这一条:
catFilter
id | catTypeId | value
1 | 1 | Classic并更改此命令:
catFilter
id | catTypeId | value
1 | 1 | Gold这样,您将有一个匹配项,并将由查询显示。到目前为止,这是一个数据问题。
编辑2
从给定的数据看,不可能有3个光环匹配:
products
id - availMetals
111 - White Gold
112 - White Gold, Yellow Gold <-- Will look here and won't match!
113 - White Gold <-- Will look here and won't match!
114 - White Gold <-- Will look here and won't match!
115 - White Gold
116 - White Gold, Platinum, Palladium <-- Will look here and won't match!更不用说,选择的答案不会向classic - 0或任何组提供0个结果。
发布于 2012-02-09 18:12:05
好的,让我们一步一步来试试:
SELECT * FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId根据您所描述的关系,上面的代码将返回连接到一个关系的表中存在的所有数据。因为我们使用了左连接,所以我们还将获得在任何产品中都不使用的catFilters。
现在,为了添加您提到的条件,让我们添加where条件:
WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1现在,您希望按CatFilter值聚合结果,因此让我们添加一个分组条件:
GROUP BY catFilter.value现在,让我们只选择所需的计数/字段:
SELECT catFilter.id, catFilter.value, count(catFilter.id) FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId
WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1
GROUP BY catFilter.valuehttps://stackoverflow.com/questions/9207750
复制相似问题