2011-06-01 131 views
0

我有usersusers和另一个表premium_users其中我持有用户名和他购买高级会员资格的日期。Mysql加入查询

如何使用mysql连接,以便在单个查询中,我可以从表users中选择所有列,并且还可以为每个高级用户知道他加入的日期。

USERS:

ID USERNAME 
1 JOHN 
2 BILL 
3 JOE 
4 KENNY 

高级用户:

ID USERID DATE 
1 2  20/05/2010 
2 4  21/06/2011 

决赛桌(将返回我的查询中的一个)应该是这样的:

ID USERNAME DATE 
1 JOHN 
2 BILL  20/05/2010 
3 JOE 
4 KENNY 21/06/2011 

某些行的DATE值为空可以吗? 如何检查该值是否为空? $row['date']==''

编辑: 这只是一个例子,但用户表有更多的专栏中,我如何从用户和premium_users只有日期选择无需编写所有列?

回答

1
select u.*, pu.DATE 
from USERS u LEFT OUTER JOIN PREMIUM_USERS pu on 
    u.ID = pu.USERID 

您可以检查是否一行是空的,:

if (!$row['DATE']) 
{ 
    ... 
} 
+0

谢谢。看到我的编辑。 – Cristy 2011-06-01 15:03:40

+0

更改了我的答案 – 2011-06-01 15:05:19

0
SELECT A.*, B.DATE 
FROM USERS A 
LEFT JOIN PREMIUIM_USERS B on A.ID=B.USERID 

EDITED

0
select USERS.ID, USERS.USERNAME, PREMIUM_USERS.DATE 
from USERS 
join PREMIUM_USERS on USERS.ID = PREMIUM_USERS.ID 
order by USERS.ID 
0

这是MSSQL语法,但它应该是相当类似的.. 。

select * 
from users u 
left join premiumUsers p 
on u.id = p.id 
order by u.id asc 
+0

这与MySQL中的语法相同。 – Johan 2011-06-01 15:11:16

+0

@Johan - 感谢您的澄清,我想如果它不完全一样,那就非常接近了 – Brett 2011-06-01 15:13:02

0

将它放在一张表中可能会更容易。您可以为isPremium(t/f)和premiumDate设置空值字段。你实际上甚至不需要isPremium字段。只是premiumDate,如果它为空,它们不是溢价,如果它有价值,它们是高级用户,并且你有他们加入的日期。

+0

我实际上没有“isPremium”专栏。我这样做是因为在某些查询中我只需要选择高级用户,所以最好只对40-50个用户进行查询,而不是10.000 – Cristy 2011-06-01 15:10:24

+0

以及您始终可以为高级用户创建一个视图。基本上从日期不为空的用户中选择*。 – Bojan 2011-06-01 15:13:53

+0

是的,但是如果我有1.000.000个用户,那么选择它会很慢。如果我有一个单独的奖励表,当我想要看到高级用户时,我只会选择那些高级用户(少于用户表的10%) – Cristy 2011-06-01 15:15:51