【问题标题】:Nested query in From clause syntax and performanceFrom 子句语法和性能中的嵌套查询
【发布时间】:2015-06-12 03:05:05
【问题描述】:

我有两个表:一个用于用户信息,第二个用于映射用户之间的某些关系(具有两个 id 的两个列表,从 id 到 id 关系) 我正在尝试为特定的用户 ID 查找他所有用户的关系 ID(内部选择),然后通过加入包含更多信息的表格来获取有关它们的更多信息。

  1. 鉴于以下错误: 错误:#1064 - 您的 SQL 语法有错误;检查与您的 mySQL 服务器版本相对应的手册列表,以在第 6 行的 ') AS i Limit 0,30' 附近使用正确的语法
    我的查询有什么问题?

  2. 这个查询在性能方面是否可以,或者有其他方法可以做到吗?

查询:

 SELECT i.*
    FROM 
        ((SELECT uc.contactId
         FROM tbl_users AS u
         JOIN tbl_users_contacts AS uc ON u.Id = uc.userId
         WHERE uc.userId =1) AS contacts_ids JOIN tbl_users AS u 
ON contacts_ids.contactId = u.Id) AS i;

编辑:固定为:

SELECT *
FROM 
    ((SELECT uc.contactId
     FROM tbl_users AS u
     JOIN tbl_users_contacts AS uc ON u.Id = uc.userId
     WHERE uc.userId =1) AS contacts_ids JOIN tbl_users AS u 
ON contacts_ids.contactId = u.Id);

不知道为什么最后的As i是个问题,所以我主要针对这个帖子问问题2。

【问题讨论】:

  • 所以你可能在用户表中同时拥有 userId 和 contactId 相同?或者您正在尝试做什么,显示一些示例数据和预期结果。
  • @AbhikChakraborty:我有用户信息、姓名、电子邮件电话等,这是 tbl_users。第二个表显示谁在他的联系人列表中拥有谁作为联系人。我想为特定用户显示他的所有联系人列表信息:为每个联系人用户获取所有详细信息(姓名电话电子邮件)
  • tbl_users_contacts 的字段是什么?
  • userId,contactId-当然每个userId都可以有多个contactId(在不同的行)

标签: mysql database pdo phpmyadmin


【解决方案1】:

考虑以下

mysql> create table tbl_users ( iduser int,name varchar(100),email varchar(100));
Query OK, 0 rows affected (0.10 sec)

mysql> insert into tbl_users values
    -> (1,'A','a@a.com'),
    -> (2,'B','b@b.com'),
    -> (3,'C','c@c.com'),
    -> (4,'D','d@d.com'),
    -> (5,'E','e@e.com');
Query OK, 5 rows affected (0.09 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> create table contacts (iduser int, contactid int );
Query OK, 0 rows affected (0.14 sec)

mysql> insert into contacts values 
    -> (1,2),(1,3),(1,5),(2,1),(2,5),(3,1),(3,4);

mysql> select * from tbl_users ;
+--------+------+---------+
| iduser | name | email   |
+--------+------+---------+
|      1 | A    | a@a.com |
|      2 | B    | b@b.com |
|      3 | C    | c@c.com |
|      4 | D    | d@d.com |
|      5 | E    | e@e.com |
+--------+------+---------+
5 rows in set (0.00 sec)

mysql> select * from contacts ;
+--------+-----------+
| iduser | contactid |
+--------+-----------+
|      1 |         2 |
|      1 |         3 |
|      1 |         5 |
|      2 |         1 |
|      2 |         5 |
|      3 |         1 |
|      3 |         4 |
+--------+-----------+
7 rows in set (0.00 sec)

现在我们可以看到 userid = 1 有 3 个联系人,我们可以得到他们

select u.* from tbl_users u 
join contacts c on c.contactid = u.iduser 
where c.iduser = 1 ;

输出将是

+--------+------+---------+
| iduser | name | email   |
+--------+------+---------+
|      2 | B    | b@b.com |
|      3 | C    | c@c.com |
|      5 | E    | e@e.com |
+--------+------+---------+

为了提高性能,您可以添加以下索引

alter table tbl_users add index userid_idx(iduser);
alter table contacts add index cu_idx(iduser,contactid);

根据需要将表和列名更改为查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多