Mysql 简单sql选择3个表
我被Mysql困住了。。。我相信这个问题已经被问了几百次了,但是没有任何关键词。我有两张桌子和一个视图: tbl_用户_测量 tbl_项目CAT_测量 大众汽车 我要查找的是在特定项目的所有度量值中,其最小值和最大值匹配的项目。用户值max>tbl\u用户\u measure.amount>min 我的方法是Mysql 简单sql选择3个表,mysql,sql,Mysql,Sql,我被Mysql困住了。。。我相信这个问题已经被问了几百次了,但是没有任何关键词。我有两张桌子和一个视图: tbl_用户_测量 tbl_项目CAT_测量 大众汽车 我要查找的是在特定项目的所有度量值中,其最小值和最大值匹配的项目。用户值max>tbl\u用户\u measure.amount>min 我的方法是 SELECT distinct v.itemid, v.measure_cat_id, v.min, v.max FROM vw_allitems v, tbl_user_meas
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“11”,因为它的值适合所有类别。看起来您就快到了。查询返回所有匹配的行;更改它,使其返回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_度量中有多少个条目。连接只选择匹配计数等于该用户总计数的用户和项目,即所有用户条目匹配,然后将其连接到原始数据以从vw_allitems返回原始行,并仅选择我们感兴趣的用户。尝试此查询:
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
@Sommath Muluk当我将第二个内部连接更改为im.item_cat=v.item_cat um没有item_cat时,我没有得到任何结果。如果我将其更改为im.measure_cat=v.measure_cat,我会得到与我的方法相同的结果。当我将count*添加到所选字段和最后的groupby itemid时,结果如下所示:itemid measure_cat_id min max count*{1 7 76 81 3,7 76 81 3,10 7 76 81 3,11 7 76 81 9}当我添加一个group by over itemid和countv.itemid时,我得到的行数可以与tbl\U itemcat\U measure中所需的度量值进行比较。但是,如果每个itemid只有一行,那么itemid=11就需要所有三行。一旦有了匹配的ID,就可以将它与原始表连接起来,以获得所有匹配的行。我会很快更新答案。非常感谢!就这样。
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
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
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