2013-11-13 6 views
0

Я знаю, что это было задано много раз раньше, но я не могу найти ответ, близкий к моему.MySQL: Подзапрос возвращает более 1 строки

У меня есть следующий запрос:

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, o.organisation_name 
FROM db_cases c, db_custinfo ci, db_organisation o 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' 
AND organisation_name = (
    SELECT organisation_name 
    FROM db_sites s, db_cases c 
    WHERE organisation_ID = '111' 
) 
AND s.sites_site_ID = c.sites_site_ID) 

То, что я пытаюсь сделать, это есть получить случаи, когда появляется также sites_site_ID, которая определяется в случаях, в таблице db_sites сайтов наряду с его organisation_ID который Я хочу фильтровать, как определено в «organisation_ID = '111», но я получаю ответ от MySQL, как указано в вопросе.

Надеюсь, это имеет смысл, и я был бы признателен за любую помощь в этом вопросе.

Спасибо.

ответ

0

Как заявляет ошибка, ваш подзапрос возвращает более одной строки, которую он не может сделать в этой ситуации. Если вы не ожидаете результатов, вам действительно стоит выяснить, почему это происходит. Но если вы знаете, что это произойдет, и хотите, чтобы только первый результат использовал LIMIT 1, чтобы ограничить результаты одной строкой.

SELECT organisation_name 
FROM db_sites s, db_cases c 
WHERE organisation_ID = '111' 
LIMIT 1 
0

Ну проблема, очевидно, что ваш подзапрос возвращает более одной строки, которая является недействительным при его использовании в качестве скалярного подзапроса например, с помощью оператора = в ИНЕКЕ.

Вместо этого вы можете сделать внутреннее соединение в подзапросе, которое будет фильтровать ваши результаты только в строках, которые соответствуют условию ON. Это даст вам все строки, которые совпадают, даже если в подзапросе есть больше, чем один.

UPDATE: Вероятно, вы получаете более одного ряда из вашего подзапроса, потому что вы делаете кросс-соединение в таблице db_sites и db_cases. Вы используете синтаксис соединения старого стиля, а затем не квалифицируете какой-либо предикат для объединения таблиц в предложение WHERE. По этой причине использование этого старого стиля соединения таблиц не рекомендуется. Было бы лучше, если бы вы прямо заявили, что это за соединение и как следует объединить таблицы.

Хорошие страницы на Соединения: http://dev.mysql.com/doc/refman/5.0/en/join.html (для правильного синтаксиса) http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html (для различия между типами соединения)

0

Я сражалась это в течение часа, и усложненной его полностью. Иногда быстрый перерыв и запись на онлайн-форуме могут решить его для вас;)

Вот как это должно быть.

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, c.sites_site_ID 
FROM db_cases c, db_custinfo ci, db_sites s 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' AND (s.organisation_ID = '111' AND s.sites_site_ID = c.sites_site_ID) 
0
Let me re-write what you have post: 

SELECT 
    c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, 
    c.cases_timestamp, c.sites_site_ID 
FROM 
    db_cases c 
JOIN 
    db_custinfo ci ON c.userInfo_ID = ci.userinfo_ID and c.cases_status = '2' 
JOIN 
    db_sites s ON s.sites_site_ID = c.sites_site_ID and s.organization_ID = 111 
Смежные вопросы