简单的sql选择超过3个表

时间:2012-02-02 02:38:30

标签: mysql sql

我坚持使用Mysql ...我确信这个问题已被问过几百次但没有任何关键字。我有2张桌子和一张视图:

tbl_user_measure

measure_cat   userid   amount
------------------------------
7             1        78
5             1        96
4             1        78

tbl_itemcat_measure

measure_cat   item_cat   
----------------------
7             1       
5             1        
4             1        

vw_allitems

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',因为它的值适合所有类别。

2 个答案:

答案 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