我有两张表:一张用于用户信息,第二张用于映射用户之间的某种关系(两个列表有两个 id,从 id 到 id 关系) 我试图找到某个特定用户的所有用户关系 ID(内部选择),然后通过加入一个有更多信息显示的表来获取有关它们的更多信息。
出现以下错误: 错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册列表,了解在第 6 行的“) AS i Limit 0,30”附近使用的正确语法
我的查询出了什么问题?这个查询在性能方面是否可以,或者还有其他方法可以做到这一点?
查询:
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 主要是为了这篇文章。
最佳答案
考虑以下因素
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);
根据您的需要将表和列名称更改为查询。
关于mysql - From 子句中的嵌套查询语法和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29492921/