简体   繁体   中英

Join table if table has results

I have a few tables

  1. clubs -> contains information on different clubs
  2. clubs-leagues -> contains information about different leagues hosted by the clubs
  3. codes -> contains description of short hand codes ive used to make data entry a little easier

clubs-leagues has a field that contains the id of the clubs to form an association with eachother.

i have the following statement

SELECT club.*, sport.name AS sport, code.description AS statusText,
    code1.description AS ageGroup, code2.description AS gender,
    leagues.name AS leagueName, leagues.ageGroup AS age, leagues.division,
    code3.description AS leagueGender, leagues.season
FROM clubs as club
JOIN sports AS sport ON sport.id = club.sport
JOIN codes AS code ON club.status = code.code
JOIN codes AS code1 ON code1.code = club.ageGroup
JOIN codes AS code2 ON code2.code = club.gender
JOIN `clubs-leagues` AS leagues ON leagues.clubId = club.id
JOIN codes AS code3 ON leagues.gender = code3.code
WHERE club.id=(:n)

it works if the club has a league but if there is no leagues (club-leagues table) then it returns no results(i want it to show the results from the club table even if there is none in the clubs-leagues table)

currently i have tried moving"JOIN clubs-leagues AS leagues ON leagues.clubId = club.id " up right after i declare clubs AS club and using a left join but i got no resuls

thanks

As indicated in comments, you need to use LEFT JOIN from clubs to leagues to get all clubs regardless of league membership. Your SQL could look like this:

SELECT club.*, sport.name AS sport, code.description AS statusText,
    code1.description AS ageGroup, code2.description AS gender,
    leagues.name AS leagueName, leagues.ageGroup AS age, leagues.division,
    code3.description AS leagueGender, leagues.season
FROM clubs as club
LEFT JOIN `clubs-leagues` AS leagues ON leagues.clubId = club.id
JOIN sports AS sport ON sport.id = club.sport
JOIN codes AS code ON club.status = code.code
JOIN codes AS code1 ON code1.code = club.ageGroup
JOIN codes AS code2 ON code2.code = club.gender
JOIN codes AS code3 ON leagues.gender = code3.code
WHERE club.id=(:n)

Note that I haven't checked the rest of the SQL, it's up to you to ensure it's correct.

使用LEFT JOINRIGHT JOIN代替JOIN来包含left | right表中的所有值,即使right | left表没有匹配的行。

SELECT *
FROM clubs as club
LEFT JOIN `clubs-leagues` AS leagues ON leagues.clubId = club.id
--LEFT JOIN sports AS sport ON sport.id = club.sport
--LEFT JOIN codes AS code ON club.status = code.code
--LEFT JOIN codes AS code1 ON code1.code = club.ageGroup
--LEFT JOIN codes AS code2 ON code2.code = club.gender
--LEFT JOIN codes AS code3 ON leagues.gender = code3.code

Since I do not know what data you have or if there may be a hidden issue with it , I would recommend this approach. Run the query above and when you get the results comment in the next line and refine your query as you see the results and know you are getting all you require. Then you can limit your select statement and add the where clause. Also be careful on the Where clauses, they can wreak havoc on left joins if not carefully used.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM