【问题标题】:Can I do it with one query?我可以用一个查询来完成吗?
【发布时间】:2011-07-12 15:45:51
【问题描述】:
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`)
);

【问题讨论】:

    标签: mysql sql optimization query-optimization


    【解决方案1】:

    连接总是最糟糕的:

    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'
    

    您唯一需要记住的是在fromtogroup_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

    【讨论】:

    • 我添加了表格的结构。我没有你假设的两个用户表!
    • @dagrevis 他没有假设您有两个用户表。他使用不同的别名(toUsersfromUsers)两次加入同一个用户表。
    • 您可以多次加入同一张表。您需要做的是与用户加入一次“to”部分,一次加入“from 部分”。然后只有别名,但这是同一个用户表。
    • 这不是“toUsers.name as toUserName”意味着我需要有toUsers 表吗?
    • 不,它只是使用第一个连接表'users'的别名,当你有INNER JOIN users AS toUsers
    【解决方案2】:

    您可以使用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 是保留关键字。

    【讨论】:

      【解决方案3】:

      我也会使用加入,但我会先创建一个视图,将邀请加入到用户中,然后将其中两个加入到一起 - 这意味着不必在邀请和用户之间重复加入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多