Не думайте с точки зрения выбора отдельных значений из таблиц. Подумайте в терминах строк, соответствующих критериям. Еще лучше подумайте, что таблица содержит строки , которые делают соответствующий оператор true и запрос, вычисляющий строки , которые делают соответствующее утверждение истинным. Сначала вы выбираете заявление; то вы пишете запрос, соответствующий этому утверждению. Here is how to design queries.
//*
all radicados columns of the rows where
a subrow is IN radicados AND a subrow is IN estudiantes
AND asignado = estudianteid
AND a subrow is IN usarios
AND usuarioid = usuario
AND nombre = $nombre_usuario
*//
select radicados.*
from radicados
join estudiantes on estudianteid = asignado
join usuarios on usarioid = usario
and nombre = $nombre_usuario
Когда исходный запрос не сообщает никаких ошибок во время выполнения, то этот запрос возвращает ту же строку. Но это не обязательно эквивалентный запрос, потому что ваш исходный запрос сообщает об ошибке выполнения, когда для данного номера пользователя (usuarios nombre) имеется более одного идентификатора пользователя (usarios usuarioid) или более одного идентификатора студента (estudiantes estudianteid) для выбранного идентификатор пользователя (usuarios usario).
//*
all columns of the radicados rows where
asignado =
the one estudianteid shared by the estudiantes rows where
usuario =
the one usuarioid shared by the usuarios rows where
nombre = $nombre_usuario
*//
select * from radicados
where asignado =
(select estudianteid from estudiantes
where usuario =
(select usuarioid from usuarios
where nombre = $nombre_usuario
)
)
Это потому, что выражение значение= (SELECT ...)
это среда выполнения безошибочное только если SELECT
возвращает таблицу с одним столбцом и одной строки. Если это так, то сравнивается значение с одним значением в этой таблице, но в противном случае оно дает ошибку.
Если вы указали свои определения таблиц, и если вы объявили определенные ключи кандидата (PRIMARY KEY
или UNIQUE NOT NULL
) или FOREIGN KEY
ограничениями, мы могли бы знать, что ошибок не будет. Когда вы знаете, что ошибок не будет, вы должны объявить соответствующие ограничения.
Хотя, вероятно, этот новый запрос тот, который вы действительно хотели в любом случае.
это пример:. Выберите radicados * из radicados присоединиться Эстудиантес на radicados.asignado = estudiantes.estudianteid присоединиться Юзеров на estudiantes.usuario = usuarios.usuarioid где usuarios.nombre = 'luiscontrerasm' это работает как шарм, спасибо –
+1 для создания «построения запроса». @LuisContreras: Исходный запрос может возвращать ошибки времени выполнения, если в ответах нет ответов. См. Мой (исправленный) ответ. – philipxy