2012-05-14 2 views
0

Когда я соединить 2 таблицы я получаю сообщение об ошибкеОбъединения-tables- подзапрос возвращает более чем на 1 строку

select * from picture where id=(SELECT id FROM user where age= 40) 

# 1242 - подзапрос возвращает более 1 строка

Что такое лучший способ присоединиться к этим двум большим таблицам данных? Я хочу, чтобы все результаты

+0

вы не присоединяетесь к двум таблицам, вы выбираете одну таблицу и квалифицируете результирующий набор на основе результата из другой таблицы. В этом случае в таблице USER было 2 идентификатора, возраст которых равен 40. Скажите, что именно вы хотите? – beck03076

+0

@ beck03076: то есть OP является полусоединением таблиц ... –

+0

@LukasEder: Да, Лукас, полу-соединение, не является объединением, не так ли ?. В любом случае спасибо за исправление. Я не понимаю его дизайн.Он сравнивает picture_id с user_id, вы заметили? – beck03076

ответ

5

Заменить = на IN

select * from picture where id in (select id from user where age = 40) 

Заметим, что это только «полу-объединения» двух таблиц, то есть вы будете только получать изображения как результаты, а не картинка пользователя связь. Если вы на самом деле пытается сделать последнее, то вам придется inner join две таблицы:

select * from picture p 
join user u on p.id = u.id -- are you sure about this join condition? 
where u.age = 40 
2

Попробуйте использовать «IN» вместо «=»

select * from picture where id IN (SELECT id FROM user where age= 40) 
+0

Присоединение - это правильный способ сделать это! –

+0

Правда, однако у нас нет всей информации для создания запроса на соединение IMO. Приведенные выше примеры объединений, похоже, сравнивают идентификатор изображения с идентификатором личности, как говорит Лукас :) – bjornruysen

+0

Итак, это то, что вам нужно сделать. –

3

В ИНЕКЕ , когда вы назначаете значение id, SQL ожидает одно значение. Проблема в том, что второй запрос SELECT id FROM user where age= 40 возвращает более одной строки.

Что вы можете сделать, это

select * 
from picture 
where id in 
    (select id from user where age = 40) 

или

select * 
from picture p, user u 
where p.id = u.id 
and u.age = 40 
2

Из того, что Im угадывание из того, что Im видя,

У вас есть "картинка" таблицы и «пользовательская» таблица.

  1. Названия таблиц должны быть множественными. Сделайте это «изображения» и «пользователи».
  2. Сначала определите свои отношения. В вашем случае один пользователь имеет несколько изображений и одно изображение принадлежит одному пользователю. (Одна фотография [в мирном мире] не принадлежит многим пользователям).
  3. В вашей таблице рисунков введите столбец «user_id» и заполните этот столбец соответствующими user_id.
  4. Теперь

Вы хотите, чтобы все фотографии пользователей, возраст которых точно 40.

Вы можете сделать,

SELECT * 
FROM pictures 
WHERE user_id IN (SELECT user_id 
        FROM users 
        WHERE user_age = 40) 

Это было ваше требование ?. Имею ли я смысл?

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