Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 简单sql选择3个表_Mysql_Sql - Fatal编程技术网

Mysql 简单sql选择3个表

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

我被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_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