Запрос получает данные от двух разных пользователей, когда я пытаюсь получить данные только от одного пользователя - PullRequest
0 голосов
/ 31 мая 2019

Я хочу получать данные только от одного конкретного пользователя, но я получаю данные от обоих пользователей. Это почему? Я не понимаю Как я могу решить это?

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

/*User*/

    CREATE TABLE `User` (
    `IDUser` INT NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`IDUser`)
);

/*Category*/

     CREATE TABLE `Category` (
      `IDCategory` CHAR(3) NOT NULL,
      `FK_User` INT NOT NULL,
      `CategoryName` VARCHAR(40) NOT NULL,
      PRIMARY KEY (`IDCategory`, `FK_User`)
    );

/*Product*/

    CREATE TABLE `Product` (
        `IDProduct` VARCHAR(18) NOT NULL,
        `FK_User` INT NOT NULL,
        `ProductName` VARCHAR(150) NOT NULL,
        `FK_Category` CHAR(3) NOT NULL,
        PRIMARY KEY (`IDProduct`, `FK_User`)
    );

ALTER TABLE `Product` ADD FOREIGN KEY (`FK_User`) REFERENCES `User`(`IDUser`);
ALTER TABLE `Product` ADD FOREIGN KEY (`FK_Category`) REFERENCES `Category`(`IDCategory`);
ALTER TABLE `Category` ADD FOREIGN KEY (`FK_User`) REFERENCES `User`(`IDUser`);

insert into User(Name) values('User1');
insert into User(Name) values('User2');

insert into Category(IDCategory,FK_User,CategoryName) values('CT1',1,'Category1User1');
insert into Category(IDCategory,FK_User,CategoryName) values('CT1',2,'Category1User2');

Если два разных пользователя вставляют оба продукта с одинаковым идентификатором:

insert into Product values('001',1,'shoe','CT1');
insert into Product values('001',2,'shoe','CT1');

Почему я продолжаю получать данные от обоих пользователей, если я пытаюсь выполнить запрос, подобный этому:

SELECT P.IDProduct,P.ProductName,P.FK_Category,C.CategoryName 
FROM Product P inner join Category C on P.FK_Category=C.IDCategory 
WHERE P.FK_User=1

вот результат, который я получаю:

Result

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Вам необходимо добавить p.FK_User=C.Fk_User это условие в предложении соединения

SELECT P.IDProduct,P.ProductName,P.FK_Category,C.CategoryName 
FROM Product P inner join Category C 
on P.FK_Category=C.IDCategory and p.FK_User=C.Fk_User
WHERE P.FK_User=1
0 голосов
/ 01 июня 2019

A PRIMARY KEY - это ключ UNIQUE. Разве CategoryID не должно быть уникальным? То есть Category не должно иметь PRIMARY KEY(CategoryId)?

(Проверьте другие таблицы на наличие аналогичной проблемы.)

0 голосов
/ 31 мая 2019

Вы получаете две строки, потому что обе категории имеют одинаковое значение IDCategory, то есть значение, на которое вы JOIN вводите. Вам также нужно JOIN для значений FK_User, чтобы вы также не получили значения категории User2:

SELECT P.IDProduct,P.ProductName,P.FK_Category,C.CategoryName 
FROM Product P 
INNER JOIN Category C ON P.FK_Category=C.IDCategory AND P.FK_User = C.FK_User
WHERE P.FK_User=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...