我可以用一个查询来做吗?

时间:2011-07-12 07:17:45

标签: mysql sql optimization query-optimization

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

获取被邀请的用户的邀请和ID的用户的ID。当然,他们互相邀请的小组的ID。我需要显示它们的用户名,但它们存储在另一个表中。团体也是如此。有关它们的信息存储在另一个表中。

我可以通过新的查询来获取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`)
);

3 个答案:

答案 0 :(得分: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'

您唯一需要记住的是在[{1}},fromto上设置外键,并在表格中的group_id上设置主键用户和组。然后您的查询将尽可能快。

所以我建议运行这个:

Id

查看一些文档:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

答案 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'

假设您的表名为usergroup以及您的字段name。您可能必须将反引号放回字段名称,因为FROM是保留关键字。

答案 2 :(得分:1)

我也使用了加入,但我首先创建一个加入邀请给用户的视图,然后将其中的两个连接在一起 - 这意味着不必重复邀请和用户之间的连接。 / p>