MySQL - PHP查询

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年未在中国旅行的客户报告,或者UN-traveled客户清单,或者需要前往印度的客户。

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


你在MySQL查询中说了user_id,但在travelled_details中定义了user。 - Devang Rathod
我猜你将用户和国家的名称和ID存储在另一个表中,所以我建议你将列重命名为 user_idcountry_id 并在这些列上添加索引。 - Ander2
8个回答

1

您的问题并不是很清楚,但从我所了解的内容来看,您希望:

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

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


1
你的表结构很好,但我希望每个客户端都没有一个ID为1。
按照你的示例,要获取没有去过中国的客户,你需要做如下操作:
SELECT DISTINCT user_id FROM travelled_details WHERE country NOT(2) AND YEAR(travel_date) NOT(2012)

1
SELECT DISTINCT user_id FROM travelled_details WHERE country<>2 AND YEAR(travel_date)=2012

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

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年未在中国旅行的客户。
要获取从未旅行过的用户列表,只需从查询中删除条件。

1

用户不在中国旅行 - 2012年

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

输出

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

SQL Fiddle演示:2012年未在中国旅行的用户列表

从未旅行过的客户名单

SELECT DISTINCT USER
  FROM travel_data
  WHERE id=NULL

SQL Fiddle演示:列出所有未旅行客户的清单。


谢谢您的回答...但我的确切需求是有一个用户表,里面有许多用户...假设用户ID 14和45去年在中国旅行。因此,我必须列出用户表中除14和45之外的所有用户...问题已编辑并添加了用户表。 - ramesh

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和user表上使用LEFT JOIN,连接列为user_id... 更多关于连接的内容请看这里

0

试一下这个

"SELECT * FROM travelled_detail WHERE (country = 1 OR country = 2) AND YEAR(travel_date)=2012"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接