2012-03-20 3 views
0

У меня вопрос о запросе sql.SQL Server 2008 Поиск пользователя

Я пытаюсь сделать запрос тем пользователем, у которого есть все типы оружия. Например.

У меня есть таблица

ITEM.

|itemid |item_name| 
| 1  | GunBow | 
| 2  | GunLong | 
| 3  | GunShot | 
|4  | SwordSm | 
|5  | SwordLg | 
|6  | Cannon | 

и у меня есть таблица

userinventory

|used_id | name_item | 
|1  | GunBow | 
|1  | GunLong | 
|1  | GunShot | 
| 2  | GunBow | 
|2  | SwardLg | 
| 2  | Cannon | 
| 3  | GunBow | 
| 3  | GunShot | 

Поскольку пользователь "1" имеет все пушки, я хотел бы сделать запрос, возвращая пользователю 1.

Что я сделал ...

Create Table #tmp(
Classname [varchar](50) NOT NULL 
) 

INSERT INTO #tmp SELECT DISTINCT iteam_name 
FROM ITEM WHERE item_name like 'Gun%' 

тогда .... Я хотел бы сравнить, чтобы найти пользователя, который имеет все п ..

Однако, я не совсем уверен, как это сделать .. потому что я не могу использовать счет или любую агрессию

В любом случае, они знают, как найти идентификатор пользователя, у которого есть все оружие?

+1

Почему не деталь имеет какое-то типа целеуказателем, вместо встраивания информации о типе в имени? –

+0

Я не совсем уверен, как это сделать .. и это требует сделать так :( –

+1

userid = 1 имеет только три пушки в соответствии с вашим столом. Как вы сказали, что у него есть все орудия ..? – Teja

ответ

2
SELECT Q.user_id 
FROM 
(
    SELECT DISTINCT item_name FROM item WHERE item_name LIKE 'Gun%' 
) P, 

(
SELECT DISTINCT X.name_item,Y.user_id 
FROM userinventory X, 
    (SELECT user_id,COUNT(DISTINCT name_item) as count_guns_userid 
    FROM userinventory 
    WHERE name_item LIKE 'Gun%' 
    GROUP BY user_id 
)Y 
WHERE X.user_id=Y.user_id 
) Q 
WHERE P.item_name=Q.name_item 
GROUP BY Q.user_id 
HAVING COUNT(Q.name_item)=3; 

Проверить решение здесь на SQL Fiddle - http://sqlfiddle.com/#!3/d10b2/1

+0

Это не сработает. Я думал, что это так, но у него есть недостаток (если только схема не действует против него). Что делать, если у пользователя есть 2 пистолета того же типа (это можно увидеть, изменив ваш SQLFiddle на наличие двух GunBow и GunShot (без GunLong) для пользователя 1). Тогда подсчеты по-прежнему будут совпадать. Однако, набрав это, я подумал об этом немного больше, вы можете сделать COUNT (DISTINCT item_name), и он должен работать. –

Смежные вопросы