Лучший способ сослаться на внешний запрос / подзапрос? - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь сослаться на поле из первой таблицы выбора в третьей таблице выбора (подзапроса). Однако это поле не распознается, когда оно переходит на этот подуровень запроса. PHP-код, над которым я работаю, использует sql для возврата части команды sql (строки), которая будет использоваться в других местах.

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

tables -----------> fields
table_users      -> [user_id, name, email, rank, ...]
table_users_jobs -> [user_id, job_id, period, ....]
table_jobs       -> [job_id, status, rank, ...]


-- sql calling code -> $rank = "t1.rank"; get_users_info_by_rank($rank);
-- maybe using: SET @rank = NULL; SELECT @rank := $rank, t1.name, ...
   SELECT t1.name, t1.email
   FROM table_users as t1
   WHERE t1.user_id IN (
       SELECT t2.user_id
       FROM table_users_jobs as t2
       WHERE t2.period = 'night' AND
         t2.job_id IN (
--         avaiable jobs to that rank -> get_job_ranks_sql($rank);
           SELECT t3.job_id 
           FROM table_jobs as t3
--         maybe using: t3.rank = @rank
           WHERE t3.rank = t1.rank AND
            t3.status = 'avaiable_position')
       )

Работая немного, я думаю, я мог бы избежать проблемы выбора 3-го уровня. Тем не менее, дело в том, что я пытаюсь повторно использовать sql код, подобный функции, которая дает мне job_id ранга, который я выбрал:

  function get_job_ranks_sql($rank){
    //probably 't3' will be renamed for something more unique
    return 'SELECT t3.job_id 
            FROM table_jobs as t3
            WHERE t3.rank = '.$rank.' AND
            t3.status = "available_position")';
  }

Даже используя php, я пытаюсь сделать его общим, если возможно, с другим языком. Используемая версия sql - MySQL 5.1.41

На самом деле я думаю, что это возможно так, как я хочу, используя переменные sql , такие как @rank, но я не уверен, что это медленнее и есть ли другие лучшие способы для сделай это.

Заранее спасибо за любую помощь:)

1 Ответ

1 голос
/ 13 июля 2011

Итак, как отметил один из комментаторов, я думаю, что вам было бы гораздо лучше использовать JOINS, чем суб-выборки. Например, если я правильно читаю ваш запрос / проблему, вы можете выполнить запрос на соединение следующим образом:

SELECT t1.name, t1.email, t3.job_id
FROM table_users t1
LEFT JOIN table_users_job t2
ON t1.user_id = t2.user_id
LEFT JOIN table_jobs t3
ON t3.job_id = t2.job_id
WHERE t2.period = 'night
AND t3.status = 'available_position'

Что гораздо лаконичнее, проще для чтения и проще в вашей базе данных. Но если вы сделаете это, вы не сможете модулировать ваш SQL. Если это действительно важно, вы можете рассмотреть возможность хранения таких запросов в хранимой процедуре. Таким образом, вы можете получить SP, чтобы он возвращал список результатов. Взгляните на этот урок:

http://www.wellho.net/resources/ex.php4?item=s163/stp4

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

Что-то еще, что следует рассмотреть, в более широкой картине, - это переход на среду PHP, которая предоставляет слой ORM, где вы можете превратить эти таблицы в объекты, а затем получить доступ к вашим данным с гораздо большей легкостью и гибкостью ( обычно). Но это очень «большая картина» и может не подходить для ваших требований проекта. Однако я могу порекомендовать такой фреймворк - CakePHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...