SQL с JOIN, возвращающий все комбинации вместо соответствующих совпадений - PullRequest
0 голосов
/ 06 декабря 2018

У меня 3 стола, спички, игроки и колоды.

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

Iпробовал с JOIN и WHERE безрезультатно, см. скрипту здесь:

https://www.db -fiddle.com / f / pPmpqxaUbA6dGFT93Fa1AV / 3

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

    CREATE TABLE `decks` (
  `did` int(10) UNSIGNED NOT NULL,
  `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `decks` (`did`, `name`) VALUES
(275, 'Porto'),
(276, 'Ajax'),
(277, 'Trofense'),
(278, 'Barcelona'),
(279, 'Real Madrid'),
(280, 'Braga');


CREATE TABLE `matches` (
  `mid` int(10) UNSIGNED NOT NULL,
  `tid` int(10) UNSIGNED NOT NULL,
  `did_1` int(10) UNSIGNED NOT NULL,
  `did_2` int(10) UNSIGNED NOT NULL,
  `result` int(1) NOT NULL,
  `pid_1` bigint(20) NOT NULL,
  `pid_2` bigint(20) NOT NULL,
  `valid` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `matches` (`mid`, `tid`, `did_1`, `did_2`, `result`, `pid_1`, `pid_2`, `valid`) VALUES
(78, 2, 275, 276, 2, 35, 36, 0),
(79, 2, 277, 273, 1, 37, 38, 0),
(80, 2, 275, 278, 1, 39, 40, 0),
(81, 2, 279, 280, 1, 41, 42, 0),
(82, 2, 276, 277, 2, 36, 37, 0),
(83, 2, 275, 279, 1, 39, 41, 0),
(84, 2, 277, 275, 2, 37, 39, 0);


CREATE TABLE `players` (
  `pid` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



INSERT INTO `players` (`pid`, `name`) VALUES
(35, 'alberto garcia'),
(36, 'Carlos Munchen'),
(37, 'benjamin Muller'),
(38, 'Toze Bandido'),
(39, 'Peter Parker'),
(40, 'Bruce Wayne'),
(41, 'Logan'),
(42, 'Tony Stark');

И то, что я пробовал до сих пор безуспешно

SELECT * FROM `matches`
    JOIN players ON matches.pid_1 = players.pid OR matches.pid_2 = players.pid
    JOIN decks ON matches.did_1 = decks.did OR matches.did_2 = decks.did
WHERE matches.tid = 2;

SELECT matches.*, players.name, decks.name FROM `matches`, players, decks
WHERE matches.tid = 2 AND matches.pid_1 = players.pid AND matches.pid_2 = players.pid AND matches.did_1 = decks.did AND matches.did_2 = decks.did;

SELECT * FROM `matches`
    RIGHT JOIN players ON matches.pid_1 = players.pid AND matches.pid_2 = players.pid
    RIGHT JOIN decks ON matches.did_1 = decks.did AND matches.did_2 = decks.did
WHERE matches.tid = 2;

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете попробовать, как показано ниже, используя union

SELECT mid,m.result,p1.name as palyer_name,
d1.name as decks_name FROM `matches` m  
left join players p1 on m.pid_1=p1.pid
left join decks d1 on m.did_1=d1.did
union 
SELECT mid,m.result,p2.name,d1.name FROM `matches` m    
left join players p2 on  m.pid_2=p2.pid
left join decks d1 on m.did_2=d1.did

demo fiddle

0 голосов
/ 06 декабря 2018

Вместо того, чтобы просто ПРИСОЕДИНИТЬСЯ, вы должны попробовать более ограничительные выходы, такие как INNER JOIN (который, я думаю, вам нужен) или LEFT / RIGHT JOIN.

Вы можете проверить все различия между JOIN в этом Q/ A: Разница между объединениями

0 голосов
/ 06 декабря 2018

Попробуйте:

    SELECT * FROM `matches`
    LEFT JOIN players players1
        ON matches.pid_1 = players1.pid 
    LEFT JOIN players players2
        ON matches.pid_2 = players2.pid 
    LEFT JOIN decks deck1
        ON matches.did_1 = deck1.did 
    LEFT JOIN decks  deck2
        ON matches.did_2 = deck2.did 
    WHERE matches.tid = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...