如何从连接两个以上的表中过滤重复的行

时间:2017-08-24 13:56:54

标签: mysql join stored-procedures

我有一个与两个以上(Ticket,Guest,Sponsor)表有一对多关系的事件表。它们与具有外键约束的事件表相关。 现在当我使用左连接使用(EVENT_ID)时,我会多次重复记录,直到达到其他表记录的最大表结果集行

是他们从其他表中获取这些记录的方法。 这是我的表格,我只在这个例子中展示了与我的问题相关的列,用于空间和简洁

    CREATE TABLE event(
                EVENT_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(30) NOT NULL,
              ) ;      
  CREATE TABLE eventSponsor (
                  SPONSOR_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
                  EVENT_ID INTEGER NOT NULL,
                  name VARCHAR(50) NOT NULL,
                 FOREIGN KEY fk_key(EVENT_ID)
                 REFERENCES event(EVENT_ID)
                ON UPDATE CASCADE
                ON DELETE CASCADE
                )ENGINE=InnoDB;
  CREATE TABLE eventGuest(
                GUEST_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
                first_name VARCHAR(30) NOT NULL,
                EVENT_ID INTEGER NOT NULL,
                FOREIGN KEY fk_guest(EVENT_ID)
                REFERENCES event(EVENT_ID)
                ON UPDATE CASCADE
                ON DELETE CASCADE
                )ENGINE=InnoDB;

         CREATE TABLE eventTicket(
                TICKET_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
                EVENT_ID INTEGER NOT NULL,
                name VARCHAR(20) NOT NULL,                                      
               FOREIGN KEY fk_ticket(EVENT_ID) 
               REFERENCES event(EVENT_ID)
                ON UPDATE CASCADE
                ON DELETE CASCADE
                )ENGINE=InnoDB;

这是我的加入

    SELECT `event`.`EVENT_ID`, `event`.`name` AS `eventName`, `eventGuest`.`GUEST_ID` `eventGuest`.`first_name` AS 'guestName',`eventSponsor`.`SPONSOR_ID`, `eventSponsor`.`name` AS 'sponsorName', `eventTicket`.`TICKET_ID`, `eventTicket`.`name` AS 'ticketName'
  FROM `event`
    RIGHT JOIN `eventTicket` USING(`EVENT_ID`)
    LEFT JOIN `eventGuest` USING(`EVENT_ID`)
    LEFT JOIN `eventSponsor` USING(`EVENT_ID`)
    WHERE `event`.`EVENT_ID` = in_eventId;

我得到

的结果
EVENT_ID |eventName | GUEST_ID | guestName | SPONSOR_ID | sponsorName | TICKET_ID | ticketName
   1     | event1  |   1  | guest1    |   1        | sponsor1    |   1  | ticket1  |
   1     | event1  |   2  | guest2    |   2        | sponsor2    |   2  | ticket2  | 
   1     | event1  |   1  | guest1    |   3        | sponsor3    |   3  | ticket3  |
   1     |  event1 |   2  | guest2    |   1        | sponsor1    |   4  | ticket4  |

看,因为有4个与该事件相关的门票,但只有2个客人和3个赞助商他们的记录重复,直到他们与门票行相同但是。 我想要的是得到这样的东西

EVENT_ID |eventName | GUEST_ID | guestName | SPONSOR_ID | sponsorName | TICKET_ID | ticketName
   1     | event1  |   1  | guest1    |   1        | sponsor1    |   1  | ticket1  |
   1     | event1  |   2  | guest2    |   2        | sponsor2    |   2  | ticket2  | 
   1     | event1  |   null  | null   |   3        | sponsor3    |   3  | ticket3  |
   1     |  event1 |   null  | null   |   null     | null        |   4  | ticket4  |

是否可以将我的联接变为twick并获得此结果,或者是默认值。如果这是你建议的解决方法。仅供我在存储过程中编写此SQL。 提前谢谢你。

0 个答案:

没有答案