2013-07-31 58 views
0

我试着加入5桌,看起来有点像这个与if条件的mysql连接表?

交表

ID |产品| user-us | make-id | dealer-id |正在等待| .... 30个其他栏... |

化妆台

ID | make |

状态表

前缀|状态|城市|拉链

成员表

ID |名称|电子邮件|密码| zip |经销商-ID

经销商表

ID |经销商名称|城市|状态| zip |地址|手机

MySQL查询看起来像这样

SELECT * 
    FROM `post` AS p 
     JOIN (`make` AS m, `state` AS s, `members` AS mb, `dealer` AS d) 
     ON (p.Make = m.id AND p.state = s.id AND p.id = mb.id AND mb.dealer-id = d.id) 
    WHERE p.pending != '1' 

问题是这样的查询只返回member.dealer-ID = dealer.id,如果我使用LEFT JOIN,将返回所有行正确的行,但表中的所有列make,state,members和dealer将为NULL。这不应该是因为我需要这些表中的信息。

Is there away我只能加入dealer表如果member.dealer-id是> 0?我可以在ID 0的经销商表中添加一行,但必须有更好的方法。

+1

只是为了更好地理解你的问题:返回没有值而不是NULL的优点是什么? – Andreas

+0

表中'post','make','state'和'members'的信息非常重要。只有当会员是经销商时,包括经销商表格info – user2636556

+0

所以唯一的解决方法是在经销商表格中添加id = 0的行? – user2636556

回答

2

一旦你编写你的加入以正常方式,仅在dealer表使用LEFT JOIN

SELECT * 
FROM post AS p 
JOIN make AS m ON p.Make = m.id 
JOIN state AS s ON p.state = s.id 
JOIN`members AS mb ON p.id = mb.id 
LEFT JOIN dealer AS d ON mb.dealer_id = d.id 
WHERE p.pending != '1' 

这将自动只能加入到经销商如有member.dealer-id大于零。

顺便说一句,我从来没有见过像你之前编码的查询连接。如果我有,我会认为它不会执行由于语法错误 - 它看起来很奇怪。

+0

谢谢!是的,你的加入看起来不那么混乱。将牢记在心。性能明智,任何优化技巧?因为我的邮政表可以变得相当大。现在已经是150k行了。或者这个工作是否完美? – user2636556

+0

这会表现得非常好(抱歉,如果你阅读我以前的评论,说它会表现不佳 - 我想我是评论一个不同的答案) – Bohemian