SQL MYSQL多表查询加入

时间:2012-02-09 08:51:27

标签: mysql sql join

好吧,在我花了好几天试图弄清楚之前,我从未在这里发帖 靠我自己。

这个非常强硬。我会非常惊讶的 也对任何解决这个问题的人敬畏。

另请注意:我在PHP中执行此操作,并不关心有多少查询或循环 我需要做到这一点..所以如果不止一个查询或PHP循环可以 请通过各种方式帮助建议。感谢

更新:为了简化这一点,如果你可以使用类似%catFilter.value%的%white Gold%insetad等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

4 个答案:

答案 0 :(得分:1)

尝试类似:

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 :(得分:1)

我使用LEFT JOIN而不是INNER JOIN,因此如果products表中不存在,它将在计数中返回零。试试这个:

SELECT     援助,     一个。Value,     COUNT(c。*)作为ProductCount 从catFilter a LEFT JOIN prodFilter b ON         a.catTypeID = b.catFilterID     LEFT JOIN产品c ON         b.productID = c.ID 在哪里c.availMetals像CONCAT('%',a。Value,'%')AND       a.catTypeId = 1 GROUP BY a.ID

更新1

SELECT 
    c.`Value`,
    COUNT(*) as TotalCount
FROM Products a LEFT JOIN prodFIlter b on
        a.ID = b.ProductID
    LEFT JOIN catFilter c
        b.CatFilterID = c.ID
WHERE c.CatTypeID = 1 and 
      a.availmetals like CONCAT('%', 'White GOld','%')
GROUP BY c.`Value`

答案 2 :(得分:1)

这会成功吗?

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个Halo匹配:

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结果的任何组。

答案 3 :(得分:1)

是的,让我们一步一步地尝试:

SELECT * FROM catFilter
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId
LEFT JOIN products ON products.id = prodFilter.productId

根据您描述的关系,上面的内容将返回连接成一个关系的表中存在的所有数据。因为我们使用LEFT JOIN,所以我们也会获得未在任何产品中使用的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.value