простой SQL выбрать более 3 таблиц - PullRequest
0 голосов
/ 02 февраля 2012

Я застрял в 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

Что я ищуfor - это элемент (ы), чьи минимальные и максимальные значения совпадают во всех измерениях конкретного элемента item_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 ]

1 голос
/ 02 февраля 2012

Похоже, ты почти у цели.Ваш запрос возвращает все совпадающие строки;измените его так, чтобы он возвращал 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, и выбираем толькоинтересующий нас пользователь.

0 голосов
/ 02 февраля 2012

Попробуйте этот запрос:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...