2

我正在使用 MySQl 根据“模块”表中的类别 ID 从 1 个表中提取类别名称。

我的以下 SQL 可以很好地满足我的需要,但我想知道这是否被认为是JOIN

既然它不调用 a JOIN?

SELECT  `mo_category_fk` ,  `mo_name_vc` ,  `mc_name_vc`
FROM x_modcats mc, x_modules m
WHERE mc.mc_id_pk = m.mo_category_fk
AND m.mo_folder_vc =  :module
4

2 回答 2

3

是 - 在 MySQL 中,隐式和显式连接具有相同的执行计划。您可以使用 来验证这一点EXPLAIN。但这是来自另一个线程的示例:

mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)

mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)
于 2013-03-17T01:09:00.927 回答
2

是的,你正在加入。根据文档,可以用作JOIN关键字 .. 的替代品,除非您不能使用非常有用的ON子句。但是,您有一个连接WHERE子句中的表的条件。在我看来,将其作为FROM条款的一部分更有意义:

SELECT mo_category_fk, mo_name_vc, mc_name_vc
FROM x_modcats mc 
JOIN x_modules m ON (mc.mc_id_pk = m.mo_category_fk)
WHERE m.mo_folder_vc = :module
于 2013-03-17T01:08:54.117 回答