从2个不相关的表中选择语句

时间:2017-05-17 05:42:59

标签: mysql

有2个未连接的表,没有公共ID

+---------------------+
| names               |
+------+--------------+
| name        | lastN |
+-------------+-------+
| Anthony     | monta |
| Ryo         | shizu |
+------+--------------+

+----------------------+
| nicknames            |
+------+---------------+
| nickname             |
+------+---------------+
| miso_hungry          |
+------+---------------+

我正在尝试在两个表上运行一个select查询,并且当前正在做类似的事情:

SELECT names.name, nicknames.nickname
FROM names, nicknames
WHERE names.name="miso_hungry" OR nicknames.nickname="miso_hungry"

我在重复相同的行时得到了一些奇怪的结果,这没有用。

例如,如果我使用上面的查询搜索miso_hungry,它会因某种原因返回“names”表的每一行,并从“nicknames”表中追加正确的行。

附上结果的屏幕截图

enter image description here

上面应该在name列下显示“NULL”,因为在该列中找不到“miso_hungry”,我不确定为什么它也会打印“names”表的每一行。

2 个答案:

答案 0 :(得分:3)

您可以使用UNION子句

  • UNION中的每个SELECT语句必须具有相同的列数
  • 列也必须具有类似的数据类型
  • 每个SELECT语句中的列也必须采用相同的顺序

所以我们需要让它们满足上述条件。我们可以使用Aliasing来做到这一点。

SELECT name,(SELECT NULL) as nickname FROM names WHERE name = "miso_hungry"

UNION

SELECT (SELECT NULL) as name, nickname FROM nicknames WHERE nickname = "miso_hungry"

<强>被修改

如果您想从两个表中获取匹配计数,请使用如下所示的查询:

SELECT SUM(count) as count FROM ( 
    SELECT count(*) as count FROM names WHERE name = "miso_hungry"
    UNION ALL
    SELECT count(*) as count FROM nicknames WHERE nickname = "miso_hungry"
) both_table 

答案 1 :(得分:1)

您的对帐单中的执行顺序是from,where,select。使用和隐式连接,您将获得一个笛卡尔产品

use sandbox;
create table n(name varchar(20));
create table nn(nickname varchar(20));

insert into n values('Antony'),('Ryo');
insert into nn values('miso');

结果

MariaDB [sandbox]> SELECT n.name, nn.nickname
    -> FROM n, nn;
+--------+----------+
| name   | nickname |
+--------+----------+
| Antony | miso     |
| Ryo    | miso     |
+--------+----------+
2 rows in set (0.00 sec)

然后应用where子句 - 产生相同的结果。