4

嗨,在我的一个项目中,我们将客户的旅行数据保存在这样的表格中

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

我们必须像这样对待报告

  1. 2012年哪些客户在中国和印度旅行

查询是

    SELECT DISTINCT user_id 
    FROM traveled_details 
    WHERE (country=1 OR country=2) AND YEAR(travel_date)=2012

我们也得到了一个客户表。所有报告都运行良好。

但是我们有一个新的要求,需要2012年没有在中国旅行的客户报告,或者曾经联合国旅行的客户名单,或者需要在印度旅行的客户

我的表结构是否足以获取这样的查询?如果是的话,我对那个查询有点困惑......有人请帮忙吗?

4

8 回答 8

1

您的问题并不完全清楚,但据我所知,您会想要:

SELECT DISTINCT user_id 
FROM travelled_details 
WHERE country NOT IN('2') 
  AND YEAR(travel_date)=2012

这将在 2012 年返回任何不在中国的旅行者。

于 2013-03-13T11:49:30.237 回答
1

您的表结构很好,但我希望每个客户都没有ID1。

按照您的示例,要获得没有去过中国的客户,您可以执行以下操作:

SELECT DISTINCT user_id FROM travelled_details WHERE country NOT(2) AND YEAR(travel_date) NOT(2012)
于 2013-03-13T11:51:39.330 回答
1
SELECT DISTINCT user_id FROM travelled_details WHERE country<>2 AND YEAR(travel_date)=2012
于 2013-03-13T11:52:39.617 回答
1

还要获得国家名称

      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
于 2013-03-13T11:53:05.587 回答
1

对于 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 年从未旅行过的用户 + 未在中国旅行过的客户。

要获取从未旅行过的用户列表,只需从查询中删除条件即可。

于 2013-03-13T12:13:16.590 回答
1

用户不在中国旅行 - 2012

SELECT DISTINCT user
  FROM travel_data
  WHERE id<>2 AND YEAR(travel_date)=2012

输出

| USER |
--------
|   12 |
|   17 |

2012年用户不在中国旅行的SQL Fiddle Demo

曾经去过联合国旅行的客户名单

SELECT DISTINCT USER
  FROM travel_data
  WHERE id=NULL

SQL Fiddle Demo of List of Un-traveled clients ever

于 2013-03-13T12:35:58.313 回答
1

嵌套查询将完成这项工作!

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

同样,对于未旅行的客户列表,在 travel_data 表上使用 LEFT JOIN,在 user_id 列上使用用户 ...更多关于连接的信息在这里

于 2013-03-13T14:15:31.763 回答
0

试试这个

"SELECT * FROM travelled_detail WHERE (country = 1 OR country = 2) AND YEAR(travel_date)=2012"
于 2013-03-13T12:04:02.247 回答