我坚持使用Mysql ...我确信这个问题已被问过几百次但没有任何关键字。我有2张桌子和一张视图:
measure_cat userid amount
------------------------------
7 1 78
5 1 96
4 1 78
measure_cat item_cat
----------------------
7 1
5 1
4 1
measure_cat min max item_cat itemid
---------------------------------------------------
7 76 81 1 1
5 97 100 1 1
4 79 81 1 1
7 76 81 1 11
5 95 97.5 1 11
4 76 79 1 11
4 33 12 2 5
我正在寻找的是项目的最小值和最大值在用户值的特定item_cat的所有measure_cat中匹配(max> tbl_user_measure.amount> min)。
我的方法是
SELECT distinct
v.itemid,
v.measure_cat_id,
v.min,
v.max
FROM
vw_allitems v, tbl_user_measure um, tbl_user u
where
um.tbl_measure_category_id = v.measure_cat_id and
(um.amount >= v.min and um.amount <= v.max) and
v.productid = 1
结果如下:
itemid measure_cat_id min max
---------------------------------------------------
1 7 76 81
7 7 76 81
10 7 76 81
11 7 76 81
11 4 76 79
11 5 95 9
我需要的只是itemid'11',因为它的值适合所有类别。
答案 0 :(得分:1)
看起来你差不多了。您的查询返回所有匹配的行;更改它以便它返回itemid
和计数,按itemid
分组。剩下的只是返回那些计数等于用户在第一个表中的行数的项目。
更新:这应该可以满足您的需求:
SELECT x.itemid, x.measure_cat, x.min, x.max
FROM
(SELECT vw.itemid i, u.userid u, count(*) mc
FROM vw_allitems vw
JOIN tbl_user_measure u ON vw.measure_cat=u.measure_cat
WHERE u.amount>=vw.min and u.amount<=vw.max
GROUP BY vw.itemid, u.userid) match_counts
JOIN
(SELECT userid u, count(*) uc
FROM tbl_user_measure
GROUP BY userid) user_counts
ON match_counts.u = user_counts.u
AND match_counts.mc=user_counts.uc
JOIN
vw_allitems x
ON match_counts.i = x.itemid
WHERE match_counts.u=1
快速演练。第一个子查询采用用户和项的每个组合,并计算匹配的数量。第二个子查询计算用户在tbl_user_measure
中拥有的条目数。连接只选择匹配计数等于该用户总数的那些用户和项目(即所有用户的条目匹配),最后我们将其加入原始数据以返回vw_allitems
的原始行并选择只是我们感兴趣的用户。
答案 1 :(得分:0)
尝试此查询:
SELECT v.itemid,
v.measure_cat_id,
v.min,
v.max
FROM vw_allitems as v,
INNER JOIN tbl_user_measure as um
ON um.measure_cat = v.measure_cat and um.amount >= v.min and um.amount <= v.max
INNER JOIN tbl_itemcat_measure as im
ON im.item_cat=um.item_cat