2015-05-25 2 views
1

я пытаюсь получить данные из 3-х таблиц одновременно, столы являются:MySQL запросов от 3 таблицы сразу

  • кандидатов
  • языки
  • candidates_language

Каждый из него представляют некоторые данные обо всех пользователях в моей базе данных.

Как следует из названия, первая таблица содержит некоторые общие данные, такие как: имя, фамилия, адрес электронной почты.

candidates 
     ------------------------------------------------------------------------ 
     | id |  firstname |  surname  |  email  | 
     ------------------------------------------------------------------------ 
     | 22 |  John  |  Doe   | [email protected]  | 
     ------------------------------------------------------------------------ 
     | 23 |  Peter  |  Miller  | [email protected]  | 
     ------------------------------------------------------------------------ 

Второй одна содержит только languages_id и LANGUAGENAME

languages 
    --------------------------------- 
    | languageID |  languageName | 
    --------------------------------- 
    |  1  |  English  | 
    --------------------------------- 
    |  2  |  German  | 
    --------------------------------- 
    |  3  |  Spanish  | 
    --------------------------------- 

И последний попытаться соединить все это вместе:

candidates_language 
    (foreign keys: candidates_id to table candidates,languageID to languages) 
     ----------------------------------------------------------------- 
     | id | candidates_id | languageID |  skill  | 
     ----------------------------------------------------------------- 
     | 1 |  22  |  1  |  basic  | 
     ----------------------------------------------------------------- 
     | 2 |  22  |  3  |  basic  | 
     ----------------------------------------------------------------- 
     | 3 |  23  |  1  |  advance  | 
     ----------------------------------------------------------------- 
     | 4 |  23  |  2  |  basic  | 
     ----------------------------------------------------------------- 

Мне нужно подключить результаты от этого 3 таблицы для только некоторые конкретных языков и сделать что-то вроде ниже:

--------------------------------------------------------------------------- 
| id | firstname | surname  |  email  | english | german | 
--------------------------------------------------------------------------- 
| 22 | John  |  Doe  | [email protected] | basic | - | 
--------------------------------------------------------------------------- 
| 23 | Peter  |  Miller  | [email protected] | advance | basic | 
--------------------------------------------------------------------------- 

Я пытаюсь соединить добраться до этой точки с кодом ниже ::

SELECT 
    candidates.firstname, 
    candidates.surname, 
    candidates_language.candidates_id, 
    candidates_language.skill, 
    languages.languageID 
FROM 
    candidates, 
    candidates_language, 
    languages 

К сожалению, я просто далек от реальных результатов я хочу. Есть ли шанс, что кто-то может мне помочь?

+0

Вы хотите, чтобы один столбец для * каждого * доступного языка в таблице ваших языков, или вам нужны столбцы только для определенных языков? – RavB

+0

Hi RavB, Мне нужны только столбцы для определенных языков.btw отредактировал мою вопросную базу на вашей заметке – Andurit

ответ

2

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

SELECT c.id, c.firstname, c.surname, c.email, 
     MAX(CASE WHEN cl.languageID = 1 THEN cl.skill ELSE '-' END) AS 'English', 
     MAX(CASE WHEN cl.languageID = 2 THEN cl.skill ELSE '-' END) AS 'German', 
     MAX(CASE WHEN cl.languageID = 3 THEN cl.skill ELSE '-' END) AS 'Spanish' 
FROM candidates AS c 
LEFT JOIN candidates_language AS cl ON c.id = cl.candidates_id 
GROUP BY c.id, c.firstname, c.surname, c.email 

Demo Here

В противном случае вы должны использовать dynamic sql.

+0

Это выглядит довольно удивительно !! – Andurit

-1

Внутренние соединения должны работать для этого.

Вы можете сделать следующее:

SELECT 
    c.firstname, 
    c.surname, 
    cl.candidates_id, 
    cl.skill, 
    l.languageID 
FROM candidates c 
INNER JOIN candidates_language cl 
    on c.id = cl.candidates_id 
INNER JOIN languages l 
    on l.languageID = cl.languageID 
+0

Hi patmcc, спасибо за ваш комментарий, к сожалению, это делает двуличие пользователей :) – Andurit

0

Поскольку языки не являются фиксированными, вы не можете добавлять их по своему выбору.

Другой вариант - для каждого языка вы получите одну запись.

select candidates.id, candidates.firstname, candidates.surname, candidates.email, languages.languageName, candidates_language.skill from candidates_language inner join candidates.id on candidates_language.candidates_id inner join languages.id on candidates.languageID 
Смежные вопросы