MySQL присоединяющийся стол - PullRequest
3 голосов
/ 04 января 2012

Я новичок в присоединении к таблицам.

ClassList
========================
ID      Level
1       2
2       2
3       4
4       1
5       3
6       7

BoysList
========================
ID      Name        Age
1       Alex        13
2       Arnold      16
3       Barny       15

GirlsList
========================
ID      Name        Age
4       Arnie       12
5       Martha      17
6       Beth        15

Мне удалось объединить два стола. Но что если в этой ситуации вам нужно сначала объединить две таблицы (BoysList и GirlsList), а затем соединить их с ClassList.

Resultset будет:

Result
================================================
ID      Name
4       Arnie           
6       Beth        
5       Martha      
1       Alex    
2       Arnold  
3       Barny       

Порядок результата: список мальчиков, девочек, имя ASC. Как это сделать?

Ответы [ 3 ]

5 голосов
/ 04 января 2012

первое, что вы сделаете, это UNION BoysList и GirlsList, затем INNER JOIN его с ClassList

SELECT  iStudentList.`ID`,
    iStudentList.`Name`,
    iStudentList.`Age`,
    ClassList.`iOrder`
FROM
ClassList INNER JOIN 
    (SELECT `ID`, `Name`, `Age`, "A" as iOrder FROM BoyssList
        UNION
     SELECT `ID`, `Name`, `Age`, "B" as iOrder FROM GirlsList) as iStudentList
ON ClassList.`ID` = iStudentList.`ID`
ORDER BY ClassList.`iOrder` DESC, iStudentList.`Name` ASC
1 голос
/ 04 января 2012

Кроме UNION, вы можете использовать OUTER JOIN:

SELECT 
    cl.ID                         AS ID
  , COALESCE(b.`Name`, g.`Name`)  AS Name
  , COALESCE(b.Age, g.Age)        AS Age
  , cl.`Level`                    AS Level
FROM
      ClassList AS cl
  LEFT OUTER JOIN 
      BoysList AS b
          ON b.ID = cl.ID
  LEFT OUTER JOIN 
      GirlsList AS g
          ON g.ID = cl.ID
1 голос
/ 04 января 2012

Вы можете использовать объединение всех (надеюсь, что этот запрос не является ошибкой)

select cl.id, bl.name<br> from ClassList cl, BoysList bl<br> where cl.id = bl.id<br> order by bl.name<br> union all<br> select cl.id, gl.name<br> from ClassList cl, GirlsList gl<br> where cl.id = gl.id<br> order by cl.name

Пересмотренный запрос:

select cl.id, bl.name, 'A' as ket<br> from boyList bl, classList cl<br> where bl.id = cl.id<br> union all<br> select cl.id, gl.name, 'B' as ket<br> from girlList gl, classList cl<br> where gl.id = cl.id<br> order by ket desc, name

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