mysql - From 子句中的嵌套查询语法和性能

标签 mysql database pdo phpmyadmin

我有两张表:一张用于用户信息,第二张用于映射用户之间的某种关系(两个列表有两个 id,从 id 到 id 关系) 我试图找到某个特定用户的所有用户关系 ID(内部选择),然后通过加入一个有更多信息显示的表来获取有关它们的更多信息。

  1. 出现以下错误: phpMyAdmin error 错误:#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 主要是为了这篇文章。

最佳答案

考虑以下因素

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/

相关文章:

java - 从字符串查询 JSP 中删除引号

java - hibernate 映射创建表

database - 测试人员对数据库的了解

mysql - 尝试在 mysql 数据库中加载数据时出现错误

php - 在 PostgreSQL 和 PDO 中使用 Haversine 公式

mysql - 合并具有使用 codeigniter 和 mysql 动态生成的不同货币的同一用户的行

php - 该代码可被利用吗? (PHP)

php - CakePHP 即时切换数据库(使用相同的数据源)?

php - 我可以在 PHP 中混合使用 MySQL API 吗?

PHP - 将 MySQL 查询从 mysql_query 更改为 PDO 的问题