Значения не вставляются в нужную запись / ы MySQL - PullRequest
0 голосов
/ 31 августа 2018

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

CREATE TABLE IF NOT EXISTS user
(
    userID VARCHAR(50) NOT NULL,
    userName VARCHAR(40) NOT NULL,        
    PRIMARY KEY (userID)
);
    CREATE TABLE IF NOT EXISTS rewards
(
    rewardID VARCHAR(5) NOT NULL,
    rewardDescription VARCHAR(20) NOT NULL,
    PRIMARY KEY (rewardID)
);

CREATE TABLE IF NOT EXISTS promos
(   
    issueDate DATETIME DEFAULT CURRENT_TIMESTAMP,
    expiryDateOfReward DATETIME GENERATED ALWAYS AS(issueDate + INTERVAL 6 MONTH),  
    quantity BIT DEFAULT 0,
    userID VARCHAR(50) REFERENCES user(userID),
    rewardID VARCHAR(5) REFERENCES rewards(rewardsID),
    PRIMARY KEY(userID, rewardID)
);

    INSERT INTO user
    VALUES('DV2015', 'Bob'),
          ('DV2016', 'Mary'),
          ('DV2017', 'Megan');

INSERT INTO rewards
VALUES('rw10', '10% Off'),
      ('rw20', '20% Off'),
      ('rw30', '30% Off');

INSERT INTO promos (issueDate, quantity, userID, rewardID)
            VALUES(DEFAULT, DEFAULT, 'DV2016', 'rw10'),
                  (DEFAULT, 1, 'DV2015', 'rw20'),
                  (DEFAULT, DEFAULT, 'DV2017', 'rw30'); 

Затем я выбираю его:

SELECT userName, 
       rewards.rewardID, 
       rewards.rewardDescription, 
       promos.quantity 
  FROM user
  JOIN promos
    ON user.userID = promos.userID
  JOIN rewards
    ON promos.rewardID = promos.rewardID
 WHERE user.userID = 'DV2015';

Я не знаю, была ли ошибка в создании таблиц, вставке записей или в операторе выбора. Вот как это выдает:

enter image description here

Я только хочу, чтобы у Боба с идентификатором пользователя 'DV2015' 'количество' равнялось 1 для 'rw20'. rw10 и rw30 должны иметь количество 0. Однако при вставке данных он дает ему все награды

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Исходя из ожидаемого результата, вы можете попробовать это.

CROSS JOIN на user и rewards таблицы для описания продуктов.

Затем promos таблицы OUTER JOIN основаны на CROSS JOIN наборе результатов.

CREATE TABLE user
(
    userID VARCHAR(50) NOT NULL,
    userName VARCHAR(40) NOT NULL  
);
CREATE TABLE  rewards
(
    rewardID VARCHAR(5) NOT NULL,
    rewardDescription VARCHAR(20) NOT NULL
);

CREATE TABLE promos
(   
    issueDate DATETIME DEFAULT CURRENT_TIMESTAMP,
    expiryDateOfReward DATETIME ,  
    quantity int DEFAULT 0,
    userID VARCHAR(50),
    rewardID VARCHAR(5)
);

    INSERT INTO user
    VALUES('DV2015', 'Bob'),
          ('DV2016', 'Mary'),
          ('DV2017', 'Megan');

INSERT INTO rewards
VALUES('rw10', '10% Off'),
      ('rw20', '20% Off'),
      ('rw30', '30% Off');

INSERT INTO promos (issueDate, quantity, userID, rewardID)
            VALUES(0, 0, 'DV2016', 'rw10'),
                  (0, 1, 'DV2015', 'rw20'),
                  (0, 0, 'DV2017', 'rw30'); 

Запрос 1 :

SELECT userName, 
       r.rewardID, 
       r.rewardDescription, 
       coalesce(p.quantity,0) quantity
  FROM user u CROSS JOIN rewards r
  LEFT JOIN promos p
    ON u.userID = p.userID and r.rewardID = p.rewardID
 WHERE u.userID = 'DV2015'

Результаты :

| userName | rewardID | rewardDescription | quantity |
|----------|----------|-------------------|----------|
|      Bob |     rw20 |           20% Off |        1 |
|      Bob |     rw10 |           10% Off |        0 |
|      Bob |     rw30 |           30% Off |        0 |
0 голосов
/ 31 августа 2018

У вас есть случайное перекрестное соединение здесь:

JOIN rewards
    ON promos.rewardID = promos.rewardID

Что, конечно, верно для всех промо-записей. Вы, вероятно, имели в виду:

JOIN rewards
    ON rewards.rewardID = promos.rewardID

Если вы хотите, чтобы «rw10 и rw30 по-прежнему имели количество 0», вам следует переключиться на LEFT JOIN вместо (INNER) JOIN.

0 голосов
/ 31 августа 2018

Вместо этого присоединяйтесь из таблицы промо

SELECT u.userName, 
   r.rewardID, 
   r.rewardDescription, 
   p.quantity 
FROM promos p
JOIN user u ON u.userID = p.userID
JOIN rewards r ON r.rewardID = p.rewardID
WHERE u.userID = 'DV2015';
0 голосов
/ 31 августа 2018

вы сделали ошибку, чтобы вставить данные в таблицу

insert into table_name values()//if you provide values all the column

в противном случае

insert into table_name (col1,col2...coln) values('use1','use2'....n)

, поэтому в вашем случае в таблицу пользователя будет вставлено значение, как показано ниже

INSERT INTO user values(1,'user_name1'),(2,'user_name2');

Допустим процесс вставки данных в две другие таблицы (награды, акции)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...