首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL MYSQL多表查询连接

问SQL MYSQL多表查询连接
EN

Stack Overflow用户
提问于 2012-02-09 16:51:27
回答 3查看 139关注 0票数 1

好吧,我不会在这里发帖,直到我花了几天时间试着自己解决这个问题。

这是非常困难的。我会非常惊讶,也会对解决这个问题的人感到敬畏。

还要注意:我是用PHP来做这件事的,并不关心我需要做多少查询或循环才能做到这一点。因此,如果有多个查询或php循环可以提供帮助,请务必提出建议。谢谢

更新:为了简化这一点,如果你可以用像%catFilter.value%这样的availMetals来解决它,我想它会更容易。

我可以使用PHP循环来完成剩下的工作。

感谢那些花时间去看的人。

我有3个表,其中包含以下字段:

代码语言:javascript
复制
catFilter - (id, catTypeId, value)
products - (id, availMetals)
prodFilter - (id, catFilterId, productId)

和下面的关系

代码语言:javascript
复制
products.id = prodFilter.productId
catFilter.id = prodFilter.catFilterId

我需要获取三个数据作为最终结果:

代码语言:javascript
复制
catFilter.id (also could be prodFilter.catFilterId)
catFilter.value

到目前为止我能让那两个。我需要第三个..

代码语言:javascript
复制
A COUNT OF ..  All Products who have an availMetals like
of %White Gold% and also has catTypeId = 1

下面是最终列表的样子。

catFilter.value -产品计数

代码语言:javascript
复制
classic - 0
rings - 0
sets - 1
stones - 5
three - 0
halo - 3

等等。等等。

以下是表的一些示例数据

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 17:11:35

尝试如下所示:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-02-09 17:25:21

这样就行了吗?

代码语言:javascript
复制
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, '%')总是假的。让我们强制它。更改此记录:

代码语言:javascript
复制
prodFilter
productId | catFilterId
111       | 43

对于这一条:

代码语言:javascript
复制
catFilter
id | catTypeId | value
1  | 1         | Classic

并更改此命令:

代码语言:javascript
复制
catFilter
id | catTypeId | value
1  | 1         | Gold

这样,您将有一个匹配项,并将由查询显示。到目前为止,这是一个数据问题。

编辑2

从给定的数据看,不可能有3个光环匹配:

代码语言:javascript
复制
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个结果。

票数 1
EN

Stack Overflow用户

发布于 2012-02-09 18:12:05

好的,让我们一步一步来试试:

代码语言:javascript
复制
SELECT * FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId

根据您所描述的关系,上面的代码将返回连接到一个关系的表中存在的所有数据。因为我们使用了左连接,所以我们还将获得在任何产品中都不使用的catFilters。

现在,为了添加您提到的条件,让我们添加where条件:

代码语言:javascript
复制
WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1

现在,您希望按CatFilter值聚合结果,因此让我们添加一个分组条件:

代码语言:javascript
复制
GROUP BY catFilter.value

现在,让我们只选择所需的计数/字段:

代码语言:javascript
复制
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.value
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9207750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档