New FAMILUG

The PyMiers

Sunday 29 April 2012

[MySQL] Chọn 2 "dòng" từ 1 bảng trong 1 câu lệnh

Đây là 1 vấn đề tớ gặp phải lúc làm việc vớ CSDL.
Yêu cầu cần lấy ra tên của 2 đội bóng tham gia 1 trận đấu
Nghe rất bình thường nhưng khi lấy ví dụ hay làm bài tập hiếm khi ta gặp :D
Trong 1 record của bảng matches có chứaa id đội nhà và id đội khách, câu hỏi là giờ làm sao bạn có thể lấy ra tên 2 đội ấy từ bảng teams chỉ trong 1 câu truy vấn?
NOTE: kết quả trả về tên 2 đội phải nằm trên 1 dòng

Trước giờ tớ quen dùng kiểu Natural Join :
FORM matches, teams
WHERE teams.id = matches.guessTeamId



để nối 2 bảng nhưng theo lối này tớ vẫn chưa nghĩ ra cách để lấy được tên cả 2 đội ra cùng 1 lúc.

SOLUTION:
dùng LEFT JOIN và ALIAS tên TABLE

SELECT matches.id as id, homeTeam.name as homeTeam, homeTeamGoals, guessTeam.name as guessTeam, rounds.name as round, startDateTime, channels.name as channel, stadiums.name as stadium
FROM `matches`
LEFT JOIN teams as homeTeam On homeTeam.id = matches.homeTeamId
LEFT JOIN teams as guessTeam ON guessTeam.id = matches.guessTeamId
LEFT JOIN rounds ON rounds.id = rounds.id
LEFT JOIN channels ON channels.id = channelId
LEFT JOIN stadiums ON stadiums.id = stadiumId
WHERE matches.roundId = rounds.id AND matches.channelId = channels.id AND matches.stadiumId = stadiums.id

lúc đầu tớ định để kiểu "mixxing" 2 loại (nghĩa là chỗ FROM có tên các bảng khác) nhưng mysql báo lỗi. Đành dùng kiểu thuần LEFT JOIN (chỉ có 1 bảng ở chỗ FROM rồi LEFT JOIN các bảng còn lại)

Đoạn WHERE ở cuối là CẦN THIẾT, vì nếu không có thì truy vấn sẽ trả về nhiều kquả chứ không phải một kết quả duy nhất.

Ai có cách giải khác thì cm nhóe :*

3 comments:

  1. Tại sao lại cứ phải dùng JOIN mà ko dùng điều kiện (where) là một câu truy vấn khác?

    ReplyDelete
  2. đương nhiên là với một biểu thức đại số thì có nhiều cách biểu diễn tương đương, tương tự trong truy vấn cũng thế, nếu mà cho thêm một vài hình dùng về bảng ghi thì mọi người dễ hình dung hơn nữa.

    Trong đầu mình vẫn thích dùng truy vấn con hơn khi mình không lười nghĩ.

    ReplyDelete
  3. http://pastebin.com/Q0zLZyyH
    đây là db cho những ai muốn hình dung. Các bạn tự thêm các "bản ghi" vào

    ReplyDelete