Как: «Получить номера пользователей для пользователей, которые играли в одну и ту же игру на всех консолях». - PullRequest
0 голосов
/ 01 октября 2018

Я пытался этот запрос в течение нескольких часов.Мой текущий запрос просто дает каждому пользователю номер и игнорирует почти все вложенные запросы.Например:

SELECT DISTINCT p.UNum
FROM Plays AS p
WHERE p.CNum IN
     (SELECT p.CNum
     FROM Plays AS p
     WHERE EXISTS
          (SELECT COUNT(p.GNum) AS GNumCount, COUNT(p.UNum) AS UNumCount
          FROM Plays AS p
          GROUP BY p.CNum
          HAVING COUNT(p.GNum) = COUNT(p.UNum)));

Это просто дает U10-U50.ОТВЕТ Я ХОЧУ ВЕРНУТЬ U20 С ИСПОЛЬЗОВАНИЕМ NESTED QUERY.Пожалуйста, помогите мне понять, что я делаю неправильно и как это исправить.Спасибо.

| Пользователи |

---------------------------------------
| UNum | UserName | Mastery | Hometown|
---------------------------------------
| U10  | Sheldon   | 20  | Tokyo |
| U20  | Missy   | 10  | NewYork |
| U30  | Meemaw   | 30  | NewYork |
| U40  | George   | 20  | Tokyo |
| U50  | Mary | 30  | Seattle |

| Игры |

---------------------------------------
| GNum | GameName | ListPrice | Version | CityCreated |
---------------------------------------
| G100  | Pong   | 9.99  | 12 | Tokyo |
| G200  | PacMan   | 24.99  | 6 | NewYork |
| G300  | Zelda   | 19.99  | 8 | Peking |
| G400  | Doom   | 9.99  | 15 | Tokyo |
| G500  | MarioBros | 19.99  | 10 | NewYork |
| G600  | Pitfall | 9.99  | 4 | Tokyo |

| Консоли |

---------------------------------------
| CNum | ConsoleName | Price | ManuLoc |
---------------------------------------
| C1  | Atari   | 99.99  | NewYork |
| C2  | Intellivision   | 129.99  | Peking |
| C3  | Nintendo   | 119.99  | Seattle |
| C4  | PlayStation   | 89.99  | Seattle |
| C5  | Coleco | 189.99  | Tokyo |
| C6  | GameBoy | 129.99  | Poughkeepsie |
| C7  | SegaGenesis | 129.99  | Tokyo |

| Игры |

---------------------------------------
| UNum | GNum | CNum | TimesPlayed |
---------------------------------------
| U10  | G100 | C1  | 22 |
| U10  | G100 | C4  | 72 |
| U20  | G300 | C1  | 44 |
| U20  | G300 | C2  | 25 |
| U20  | G300 | C3  | 27 |
| U20  | G300 | C4  | 55 |
| U20  | G300 | C5  | 69 |
| U20  | G300 | C6  | 44 |
| U20  | G300 | C7  | 86 |
| U20  | G500 | C2  | 14 |
| U30  | G300 | C1  | 21 |
| U30  | G400 | C2  | 52 |
| U40  | G600 | C3  | 33 |
| U40  | G600 | C7  | 38 |
| U50  | G100 | C4  | 15 |
| U50  | G200 | C2  | 27 |
| U50  | G200 | C4  | 14 |
| U50  | G300 | C4  | 2 |
| U50  | G400 | C4  | 8 |
| U50  | G500 | C4  | 44 |
| U50  | G500 | C5  | 56 |
| U50  | G500 | C7  | 1 |
| U50  | G600 | C2  | 24 |
| U50  | G600 | C4  | 55

1 Ответ

0 голосов
/ 01 октября 2018

Хм, первый GROUP BY пользователь и игра.В предложении HAVING проверьте, что количество различных консолей равно количеству всех консолей.Это должно дать вам пользовательские пары игр, в которые пользователь играл на всех консолях.Используйте DISTINCT, чтобы получить каждого пользователя только один раз.

SELECT DISTINCT
       unum
       FROM plays
       GROUP BY unum,
                gnum
       HAVING count(DISTINCT cnum) = (SELECT count(*)
                                             FROM consoles)) x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...