Могу ли я сделать это одним запросом? - PullRequest
0 голосов
/ 12 июля 2011
SELECT `invites`.`id`, `invites`.`from`, `invites`.`to`, `invites`.`group_id`
FROM `invites`
WHERE `invites`.`to` = '33'

Получает идентификатор пользователя, отправившего приглашение, и идентификатор приглашенного пользователя. И, конечно же, удостоверение личности группы они пригласили друг друга. Мне нужно отобразить их имена пользователей, но они хранятся в другой таблице. То же самое касается групп. Информация о них хранится в другой таблице.

Я мог бы делать новые запросы, чтобы получить эту информацию из идентификаторов, но стоит ли это того? Могу ли я сделать это только одним запросом?

Edit:

Состав:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `surname` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
);

CREATE TABLE `invites` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `group_id` int(10) unsigned NOT NULL,
  `from` int(10) unsigned NOT NULL,
  `to` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `groups` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Объединение всегда хуже:

SELECT `invites`.`id`, 
       `invites`.`from`, 
       `invites`.`to`, 
       `invites`.`group_id`,
       `toUsers`.`name` as toUserName,
       `fromUsers`.`name` as fromUserName,
       `groups`.`name` as groupName
FROM `invites`
    INNER JOIN `users` AS toUsers
        ON `invites`.`to` = toUsers.id
    INNER JOIN `users` AS fromUsers
        ON `invites`.`from` = fromUsers.id
    INNER JOIN `groups`
        ON `invites`.`group_id` = `groups`.`id`
WHERE `invites`.`to` = '33'

Единственное, что вы должны иметь в виду, это иметь внешние ключи на from, to и group_id и иметь первичные ключи на Id в таблицах пользователей и групп. Тогда ваш запрос будет выполнен так быстро, как вам нужно.

Так что советую запустить это:

ALTER TABLE `invites`
ADD CONSTRAINT FK_invites_to FOREIGN KEY (`to`) REFERENCES users(id),
ADD CONSTRAINT FK_invites_from FOREIGN KEY (`from`) REFERENCES users(id),
ADD CONSTRAINT FK_invites_group FOREIGN KEY (`group_id`) REFERENCES groups(id)

См. Некоторые документы: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

1 голос
/ 12 июля 2011

Я бы тоже использовал объединение, но сначала я создал бы представление, которое объединяет приглашения для пользователей, а затем соединял два из них вместе - это означает, что нет необходимости повторять объединение между приглашением и пользователем.

1 голос
/ 12 июля 2011

Вы можете использовать JOIN :

SELECT invites.id, invites.from, invites.to, invites.group_id, group.name, u1.name, u2.name
FROM invites, user as u1, user as u2, group
WHERE invites.from = u1.id
AND invites.to = u2.id
AND group.id = invites.group_id
AND invites.to = '33'

Предполагается, что ваши таблицы называются user и group, а ваши поля name. Возможно, вам придется поставить обратные метки на имена полей, потому что FROM является зарезервированным ключевым словом.

...