Mysql选择连接记录存在的表

时间:2011-09-12 08:37:52

标签: mysql

我有两个相同的表,但只有一个表存在记录,我需要选择要加入的表。

示例:

目录

| catalog_id | catalog_name |

catalog_draft

| catalog_id | catalog_name |

catalog_items

| item_id | catalog_id | item_name |

因此,通过这个小例子,我需要获取所有带有目录名称的项目,但目录名称可以在目录 catalog_draft 表中。

3 个答案:

答案 0 :(得分:3)

Use union

select something from table1 where id=?
union
select something from table2 where id=?;

example : 

mysql> select 1 union select 1;
+---+
| 1 |
+---+
| 1 |
+---+

至于你的实际问题

select catalog_id, catalog_name from catalog where catalog_name=?
union
select catalog_id, catalog_name from catalog_draft where catalog_name=?;

上述联合将结合两个表的结果 这意味着如果目录存在于catalog表和catalog_draft表中,
只有第一个目录从目录表中返回

答案 1 :(得分:0)

你的问题很模糊。让我看看我是否做对了:

您有两个表AB,两个表都有相同的列。您有一个存在于其中一行中的某一行。您想要找到该表并将其与其他表连接吗?

如果这是真的,这是你的答案:

假设表中包含这些列(id, data)

这是你如何做到的。对于每个表,您outer join表自己,选择第一部分等于您要查找的所有行,但只选择其他列。然后你结合你为两个表做的事情:

(SELECT * FROM
    A AS first RIGHT JOIN A AS second
    ON first.id = your_id AND first.data = your_data)
UNION
(SELECT * FROM
    B AS first RIGHT JOIN B AS second
    ON first.id = your_id AND first.data = your_data)

这样,没有该条目的表将使其SELECT返回一个空表UNION和其他完整表。

以下是一个例子:

表A的数据

(0, 8324)
(1, 215)
(2, 47879)

当您进行外部联接(完全外部联接)时,您会得到:

(0, 8324, 0, 8324)
(0, 8324, 1, 215)
(0, 8324, 2, 47879)
(1, 215, 0, 8324)
(1, 215, 1, 215)
(1, 215, 2, 47879)
(2, 47879, 0, 8324)
(2, 47879, 1, 215)
(2, 47879, 2, 47879)

当您在first.id == 1 AND first.data == 215上进行外部联接时,您会得到:

(1, 215, 0, 8324)
(1, 215, 1, 215)
(1, 215, 2, 47879)

现在,如果你有right join ed而不是完全加入,你会得到:

(0, 8324)
(1, 215)
(2, 47879)

你有桌子A!如果您正在搜索不存在的条目,那么您将有一个空表。

最后,此命令的结果是您可以在其他地方使用的表,例如,如果您想将其与其他表连接:

SELECT * FROM
    ((SELECT * FROM
        A AS first RIGHT JOIN A AS second
        ON first.id = your_id AND first.data = your_data)
    UNION
    (SELECT * FROM
        B AS first RIGHT JOIN B AS second
        ON first.id = your_id AND first.data = your_data))
    JOIN other_table ON some_condition

答案 2 :(得分:0)

我已经设法通过使用IF自己完成。解决方案查询是:

SELECT 
   ci.item_name, ci.item_id, IF(c.catalog_name, c.catalog_name, cd.catalog_name)
FROM catalog_items AS ci
   LEFT JOIN catalog AS c
   ON c.catalog_id = ci.catalog_id
   LEFT JOIN catalog_draft AS cd
   ON cd.catalog_id = ci.catalog_id