2015-07-17 2 views
1

У меня есть две разные таблицы. cities_buildings и map_buildings. Оба имеют EXACT SAME Название/структура COLUMN.SELECT Из двух разных таблиц с тем же предложением WHERE?

Можно ли сделать что-то вроде этого, и по-прежнему иметь каждую запись из любой таблицы сами по себе?

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) 

Заранее благодарен!

+0

Не могли бы вы привести нам пример того, какой будет ваш желаемый результат? Я думаю, что у меня есть хорошее предположение о том, чего вы хотите достичь, но поскольку я не читаю мысли, я не могу быть уверен. :-) – Anders

+0

@anders Привет, Я пытаюсь объединить результаты из двух таблиц самостоятельно. Тем не менее, у меня нет отношения 1: 1 записей 'cb' и' mb', в результате чего в одной строке будут две записи: http://puu.sh/j2Lxy/e0d8233299.png --- is есть ли способ поместить все записи в их собственную строку без запуска двух отдельных запросов SELECT? – justin

+0

Спасибо. Если один из ответов еще не решил проблему, было бы здорово, если бы вы могли предоставить нам изображение (или текстовую таблицу) желаемого результата. Кроме того, не могли бы вы обновить свой вопрос с помощью любой новой информации, а не просто публиковать ее в комментариях? Комментарии - это граждане второго сорта SO, и кто-то, проходящий мимо, должен иметь возможность получить всю важную информацию только от вопросов. – Anders

ответ

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) 

Это concatenats таблицы, а затем находит строки с 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) будет быть бессмысленным, поскольку между таблицами не будет общих рядов.

+0

Идеально, ответил на все, включая то, как я мог определить, какая запись была из этой таблицы. :) – justin

+0

Рад, что это помогло. (Добавлена ​​небольшая заметка о 'UNION ALL' в конце.) – Anders

+0

Упс, быстрый вопрос.Кажется, MySQL не нравится второй запрос, который вы предоставили. Это объясняет: «... для правильного синтаксиса для использования рядом с AS mb FROM map_buildings) WHERE city_id IN (1,2) '' - Кажется, не нравится определение столбцов. Может быть, это моя версия? Моя MySQL-версия '5.5.27' – justin

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); 
+0

Привет! Спасибо за ответ! Это почти то, что я хочу. Но можно ли разбить результаты из каждой таблицы? например: это выглядит так, как только я запускаю ваш запрос: http://puu.sh/j2KZN/29c317d62b.png --- это происходит, когда нет идеального соотношения 1: 1 зданий 'cb' к' мб' зданий. – justin

+0

Ах, не идеальное соотношение: Затем мы используем LEFT JOIN, полагая, что таблица CB всегда имеет больше таблицы mb: см. Обновленный запрос. –

Смежные вопросы