MYSQL Соединить три таблицы с исключениями - PullRequest
0 голосов
/ 28 марта 2019

Я работаю с тремя таблицами SQL и использую INNER JOIN для объединения этих таблиц.Вот обзор того, как выглядят таблицы.

enter image description here

CREATE TABLE `User` (
   `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   `firstName` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   `lastName` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   `email` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   PRIMARY KEY (`id`)                                                                       ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |


CREATE TABLE `Ownership` ( 
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `user` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
   `certificate` int(10) unsigned NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `unicity` (`user`,`certificate`)                                              ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

CREATE TABLE `Certificate` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `domain` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   `creationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,   
   `expirationDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
   `type` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
   PRIMARY KEY (`id`)                                                                       ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

Запрос на присоединение к таблицам следующий:

select user, lastName, domain 
from Ownership 
    INNER JOIN User ON Ownership.user = User.id 
    INNER JOIN Certificate ON Ownership.certificate = Certificate.id;`

У меня есть такой результат, например: enter image description here

Я хотел бы получить только одного пользователя для одного доменного имени и создать исключение для объединения.только если значение certificate.domain еще не существует.

Возможно ли это с MYSQL?

Спасибо

1 Ответ

1 голос
/ 28 марта 2019

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

select 
      C.domain,
      min( O.user ) JustOneUser 
   from 
      Certificate C
         JOIN Ownership O
            on C.ID = O.Certificate
   group by
      C.Domain

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

select
      PQ.Domain,
      U.LastName,
      U.FirstName
   from
      (select 
             C.domain,
             min( O.user ) JustOneUser 
          from 
             Certificate C
                JOIN Ownership O
                   on C.ID = O.Certificate
          group by
             C.Domain ) PQ
      JOIN User U
         on PQ.JustOneUser = U.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...