嗨,在我的一个项目中,我们将客户的旅行数据保存在如下表中
id | user | country | travel_date |
------------------------------------------------------------------
1 | 12 | 4 | 2012-03-13 16:57:41 |
1 | 17 | 8 | 2012-03-13 16:57:41 |
1 | 12 | 5 | 2011-03-13 16:57:41 |
1 | 13 | 8 | 2011-03-13 16:57:41 |
1 | 11 | 3 | 2011-03-13 16:57:41 |
1 | 10 | 1 | 2013-03-13 16:57:41 |
1 | 12 | 1 | 2012-03-13 16:57:41 |
我们有一个这样的国家表
id | name
------+----------
1 | India
2 | China
8 | Hongkong
3 | Singapore
有这样一个用户表
id | Name
--------+----------
12 | name
17 | name 2
11 | name 3
10 | name 4
我们必须像
那样做报告- 哪些客户在中国和印度旅游2012
查询是
SELECT DISTINCT user_id
FROM traveled_details
WHERE (country=1 OR country=2) AND YEAR(travel_date)=2012
我们还得到了一个Clients表。所有的报告都工作正常。
但是我们有了一个新的要求,需要一份2012年没有去过中国的客户报告,或从未旅行过的客户名单,或需要在印度旅行的客户名单
我的表结构是否足以获取这样的查询?如果是的话,我对这个问题有点困惑……谁来帮忙?
嵌套查询将完成这项工作!!
SELECT user_id from travelled_details
WHERE user_id NOT IN
(SELECT DISTINCT user_id FROM travelled_details WHERE country NOT(2) AND YEAR(travel_date) NOT(2012) )
要实际打印客户端的名称,可以在用户表
上使用join类似地,对于未旅行的客户端列表,在列user_id…上对表travel_data和user使用LEFT JOIN。这里有更多关于join的信息
您的表结构很好,但我希望每个客户端都没有1的ID
。
按照你的例子,要获得没有去过中国的客户,你可以这样做:
SELECT DISTINCT user_id FROM travelled_details WHERE country NOT(2) AND YEAR(travel_date) NOT(2012)
SELECT DISTINCT user_id FROM travelled_details WHERE country<>2 AND YEAR(travel_date)=2012
获取国家名称
SELECT DISTINCT t.user_id ,t.country,c.name
FROM traveled_details t, country c
WHERE t.country !=2 AND AND YEAR(travel_date)=2012
你的问题不是很清楚,但从我可以收集到你想要的:
SELECT DISTINCT user_id
FROM travelled_details
WHERE country NOT IN('2')
AND YEAR(travel_date)=2012
将返回2012年不在中国的旅客
对于2012年未在中国旅行的客户报告,最好的选择是选择所有在2012年去过中国的用户,并将结果传递给嵌套查询。
SELECT * FROM clients_table WHERE id NOT IN (SELECT user as id FROM travel WHERE country=2 AND YEAR(travel_date)=2012)
通过这种方式,你将获得从未去过中国的用户+ 2012年没有去过中国的客户。
要获得从未旅行过的用户列表,只需从查询中删除条件。
2012年中国用户不旅游
SELECT DISTINCT user
FROM travel_data
WHERE id<>2 AND YEAR(travel_date)=2012
输出| USER |
--------
| 12 |
| 17 |
SQL Fiddle Demo of Users not travel in china 2012
未旅行客户列表
SELECT DISTINCT USER
FROM travel_data
WHERE id=NULL
SQL Fiddle演示未旅行的客户端列表
try this
"SELECT * FROM travelled_detail WHERE (country = 1 OR country = 2) AND YEAR(travel_date)=2012"