Могу ли я сделать это одним запросом?

0
SELECT 'invites'.'id', 'invites'.'from', 'invites'.'to', 'invites'.'group_id'
FROM 'invites'
WHERE 'invites'.'to' = '33'

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

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

Редактировать:

Состав:

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')
);
  • 1
    да. использовать соединение
Теги:
optimization
query-optimization

3 ответа

3
Лучший ответ

Соединение всегда худшее:

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

  • 0
    Я добавил структуру моего стола. У меня нет двух пользовательских таблиц, как вы предполагаете!
  • 0
    @dagrevis Он не предполагал, что у вас есть две пользовательские таблицы. Он присоединяется к тем же таблицам пользователей в два раз , используя различные псевдонимы ( toUsers и fromUsers ).
Показать ещё 4 комментария
1

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

1

Вы можете использовать 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 вашего поля. Возможно, вам придется вернуть backticks на имена полей, потому что FROM является зарезервированным ключевым словом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню