Mysql - PHP query


Mysql - PHP query

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

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

我们还得到了一个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"