2015-01-28 4 views
1

Мне нужно написать этот запрос, используя внутренние соединения или вправо/влево включается, но я не знаю, как начать:Заменить сравнение на скалярный подзапрос на внутреннее соединение или влево/вправо присоединиться

select * from radicados where asignado = 
    (select estudianteid from estudiantes where usuario = 
     (select usuarioid from usuarios where nombre = $nombre_usuario)) 

Но дон Не знаю, как сделать то же самое с объединениями.

Я думаю, что это должно быть что-то вроде:

select * from radicados inner join usuarios on usuarioid=usuario 

ответ

2

Похоже, вы хотите что-то вроде этого:

select radicados.* 
from 
    radicados 
    join estudiantes 
    on radicados.asignado = estudiantes.estudianteid 
    join usarios 
    on estudiantes.usario = usarios.usarioid 
    where usarios.nombre = $nombre_usuario 

При построении такого запроса, начните с пунктом FROM. Соедините вместе таблицы, содержащие необходимые данные, на основе отношений между ними. Если необходимо, добавьте предложение WHERE, описывающее любые дополнительные условия, по которым вы хотите отфильтровать результат вашего соединения. Затем заполните список SELECT.

При некоторых обстоятельствах вам может потребоваться также добавить другие предложения (ORDER BY, GROUP BY и т. Д.), Но это не плохо, если вы понимаете основные запросы.

+0

это пример:. Выберите radicados * из radicados присоединиться Эстудиантес на radicados.asignado = estudiantes.estudianteid присоединиться Юзеров на estudiantes.usuario = usuarios.usuarioid где usuarios.nombre = 'luiscontrerasm' это работает как шарм, спасибо –

+0

+1 для создания «построения запроса». @LuisContreras: Исходный запрос может возвращать ошибки времени выполнения, если в ответах нет ответов. См. Мой (исправленный) ответ. – philipxy

1

Это то же самое, как

SELECT estudiantes.* FROM radicados 
JOIN estudiantes ON estudianteid = asignado 
JOIN usuarioid ON usuarioid = usuario 
WHERE nombre = $nombre_usuario 

Я предполагаю, что здесь, что имена столбцов являются уникальными. Если нет, вам нужно добавить имена таблиц в имена полей.

+0

Да, столбец usuarioid является первичным ключом, а также имя usuario является уникальным –

1

Не думайте с точки зрения выбора отдельных значений из таблиц. Подумайте в терминах строк, соответствующих критериям. Еще лучше подумайте, что таблица содержит строки , которые делают соответствующий оператор 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 ограничениями, мы могли бы знать, что ошибок не будет. Когда вы знаете, что ошибок не будет, вы должны объявить соответствующие ограничения.

Хотя, вероятно, этот новый запрос тот, который вы действительно хотели в любом случае.

+0

Я знаю, как делать такие запросы, но я не знаю разницы в использовании объединений или подзапросов. –

+0

1. Я не могу сказать, что вы пытаетесь сказать своим комментарием. Объясните, пожалуйста, используя больше слов. 2. Почему вы написали этот (непонятный) факт? Какова ваша позиция? Вы пытаетесь задать вопрос? PS: Вы прочитали ссылку? PPS: * table * 'ON/WHERE' * value *' = '* subquery * is * table * rows с * значением *, равным единому значению в * подзапросе *; но * table * 'JOIN' * подзапрос *' ON/WHERE' * test * - это строки, сделанные из комбинации строки из * таблицы * И строки из * подзапроса * AND, которые передают * test *. Решите, что вы хотите сказать, а затем переведите на SQL. – philipxy