SELECT FROM两个具有相同WHERE子句的不同表?

时间:2015-07-17 17:54:08

标签: mysql select where-clause

我有两张不同的牌桌。 cities_buildingsmap_buildings。两者都有完整的相同列名称/结构。

是否可以做这样的事情,并且仍然可以自己从两个表中获得每条记录?

SELECT  cb.city_id,
    cb.type,cb.x,
    cb.y,
    mb.city_id,
    mb.type,
    mb.x,
    mb.y
FROM    cities_buildings AS cb,
    map_buildings AS mb
WHERE city_id IN (1,2)

提前致谢!

2 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT  cb.city_id,
cb.type,cb.x,
cb.y,
mb.city_id,
mb.type,
mb.x,
mb.y
FROM    cities_buildings AS cb,
map_buildings AS mb
WHERE mb.city_id IN (1,2) AND cb.city_id IN (1,2);

然而这可能更好:

SELECT  cb.city_id,
cb.type,cb.x,
cb.y,
mb.city_id,
mb.type,
mb.x,
mb.y
FROM    cities_buildings AS cb,
map_buildings AS mb
WHERE mb.city_id IN (1,2) AND mb.city=cb.city;

这与城市有关。

替代方案(最常用的是):

SELECT  cb.city_id,
cb.type,cb.x,
cb.y,
mb.city_id,
mb.type,
mb.x,
mb.y
FROM    cities_buildings AS cb
LEFT JOIN map_buildings AS mb ON mb.city=cb.city
WHERE mb.city_id IN (1,2);

答案 1 :(得分:0)

不完全确定你想要完成什么,但也许会这样做:

SELECT * FROM (
    SELECT city_id, type, x, y FROM cities_buildings
    UNION ALL
    SELECT city_id, type, x, y FROM map_buildings
) WHERE city_id IN (1,2)

将表连接起来,然后从其中任何一个中找到city_id为1或2的行。

如果表格中有重复项且不希望在输出中出现重复项,请使用UNION代替UNION ALL。不过,这会对性能产生影响。

如果您希望能够跟踪行的来源,可以将查询的内部部分更改为:

SELECT city_id, type, x, y, 'cities_buildings' AS table_name FROM cities_buildings
UNION ALL
SELECT city_id, type, x, y, 'map_buildings' AS table_name FROM map_buildings

如果你使用UNION(没有ALL)来遵循这种方法,那将毫无意义,因为表之间没有公共行。