开发者

My SQL isn't limiting my list to just the instance I want

So I am trying to return only the records that are set to default from a mapping table but it is setting all languages to default related to that item from that market. Bellow is the exact sql I am using.

SELECT `teams`.*, 
       `markets`.`title` AS `market`, 
       `markets`.`short_name`, 
       `market_countries`.*, 
       `countries`.`title` AS `country`, 
       `languages`.`title` AS `language`, 
       `languages`.`short_code`, 
       `status`.`title` AS `status`, 
       `team_types`.`title` AS `type`, 
       `market_languages`.* 
FROM `teams` 
JOIN `markets` ON teams.market_id = markets.id 
LEFT JOIN `market_countries` ON markets.id = market_countries.market_id     
LEFT JOIN `countries` ON countries.id = market_countries.cou开发者_如何学编程ntry_id 
LEFT JOIN `languages` ON languages.id = teams.language_id 
LEFT JOIN `status` ON teams.status_id = status.id 
JOIN `team_types` ON team_types.id = teams.type_id 
JOIN `market_languages` ON teams.market_id = market_languages.market_id     
WHERE (market_languages.is_default = 1) 
  AND (teams.status_id = 3)     
GROUP BY `teams`.`id` 
ORDER BY `teams`.`order_id` ASC, `teams`.`status_id` ASC

now I am obtaining specific columns and joining on a market and on the language but there is another table that relates markets and languages and which is the default language. unfortunately the it is saying that both languages are default where in the db it is clearly just 1 language default for that market.


So after more tweeking I found my solution, initially I was doing the single join and hoping to get a good return on the language but but markets where wrong. So I did some searching on complex joins and I came to a good resource on on www.bryanwebconsulting.com/blog/ Outer Join on Multiple Fields.

So after reading that I modded the sql as follows:

SELECT `teams`.*, 
    `markets`.`title` AS `market`, 
    `markets`.`short_name`, 
    `market_countries`.*, 
    `countries`.`title` AS `country`, 
    `languages`.`title` AS `language`, 
    `languages`.`short_code`, 
    `status`.`title` AS `status`, 
    `team_types`.`title` AS `type`, 
    `market_languages`.* 

FROM `teams` 

INNER JOIN `markets` ON teams.market_id = markets.id 

LEFT JOIN `market_countries` ON markets.id = market_countries.market_id 

LEFT JOIN `countries` ON countries.id = market_countries.country_id 

LEFT JOIN `languages` ON languages.id = teams.language_id 

LEFT JOIN `status` ON teams.status_id = status.id 

INNER JOIN `team_types` ON team_types.id = teams.type_id 

INNER JOIN `market_languages` ON ( teams.language_id = market_languages.language_id 
AND teams.market_id = market_languages.market_id) 

WHERE (market_languages.is_default = 1) 
AND (teams.status_id = 3) 

GROUP BY `teams`.`id` 

ORDER BY `teams`.`order_id` ASC, `teams`.`status_id` ASC

So yes you are able to do a more detailed join using the AND "blah blah ON (AND)".

Hope this helps others too and I think I could clean this up even more now.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜