2013-03-31 2 views
3

В базе данных у меня есть таблица имен пользователей, и у меня есть таблица юрисдикции. У меня также есть промежуточная таблица для назначения пользователя одной или нескольким юрисдикциям.Заявление MySql для выбора на основе столбца в промежуточной таблице

стол сотрудник

  • идентификатор пользователя (первичный ключ)
  • ПгвЬЫате
  • LastName

записей:

+--------+-----------+----------+ 
| userID | firstName | lastName | 
+--------+-----------+----------+ 
|  6 | John  | Doe  | 
|  11 | lisa  | lopez | 
+--------+-----------+----------+ 

юрисдикций таблица

  • JURID (первичный ключ)
  • область

записей:

+-------+--------------+ 
| jurID | jurisdiction | 
+-------+--------------+ 
|  1 | California | 
|  2 | Texas  | 
|  3 | Washington | 
|  4 | South Dakota | 
|  5 | Alaska  | 
|  6 | Ohio   | 
+-------+--------------+ 

user_jurisdiction

  • идентификатора пользователя (Foriegn ключ, ссылающихся на сотрудник идентификатор пользователя)
  • JURID (Foriegn ключ, ссылающихся на юрисдикции JURID)

записей:

+--------+-------+ 
    | userID | jurID | 
    +--------+-------+ 
    |  6 |  2 | 
    |  6 |  3 | 
    |  11 |  2 | 
    +--------+-------+ 

Я пытался в течение нескольких часов, чтобы придумать sql, который выберет/перечислит всех работников из «Техаса». Я использовал много препирательств этого заявления sql, но не успел:

SELECT jurisdictions.jurisdiction, 
     employees.firstName 
FROM jurisdictions, 
     employees 
     INNER JOIN user_jurisdictions 
      ON user_jurisdictions.jurID = jurisdictions.jurID AND 
       user_jurisdictions.userID = employees.userID 
WHERE jurisdictions.jurisdiction = "Texas"; 

Но я не имел успеха. В какой команде sql будет представлен список сотрудников, участвующих в юрисдикции. Jurisdiction = «Texas»;

ответ

2

Что вы сейчас делаете сейчас, являетесь ли вы производством катарского продукта из таблиц: employees и jurisdictions. Правильный синтаксис объединений заключается в явном определении типа соединения между двумя таблицами.

SELECT a.*, c.* 
FROM employees a 
     INNER JOIN user_jurisdiction b 
      ON a.userID = b.userID 
     INNER JOIN jurisdictions c 
      ON b.jurID = c.jurID 
WHERE c.jurisdiction = 'Texas' 

ВЫВОД текущего запроса

╔════════╦═══════════╦══════════╦═══════╦══════════════╗ 
║ USERID ║ FIRSTNAME ║ LASTNAME ║ JURID ║ JURISDICTION ║ 
╠════════╬═══════════╬══════════╬═══════╬══════════════╣ 
║  6 ║ John  ║ Doe  ║  2 ║ Texas  ║ 
║  11 ║ lisa  ║ lopez ║  2 ║ Texas  ║ 
╚════════╩═══════════╩══════════╩═══════╩══════════════╝ 

Для дальнейшего получить больше знаний о соединяющую, любезно перейдите по ссылке ниже:

+0

Спасибо. Являются ли «сотрудники» такими же, как «сотрудники AS»? – dman

+1

@ dhee да. ключевое слово 'AS' * необязательно *. –

+0

Может ли моя промежуточная таблица извлечь выгоду из первичного ключа, даже если я не использую/не нуждаюсь в первичном ключе для этого? – dman

2
SELECT 
e.* 
FROM 
jurisdictions j, user_jurisdiction uj, employees e 
WHERE 
uj.jurID = j.jurID AND 
uj.userID = e.userID AND 
j.jurisdiction = 'Texas'; 
+0

Как это утверждение работает без внутреннего соединения? – dman

+0

Это явное соединение, эквивалентное синтаксису INNER JOIN –