4

こんにちは私のプロジェクトの1つで、クライアントの旅行データを次のようなテーブルに保持しています

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年に中国を旅行しなかったクライアント、これまでに旅行したことのないクライアントのリスト、またはインドを旅行する必要のあるクライアントのレポートを必要とする新しい要件がありました。

私のテーブル構造は、そのようなクエリをフェッチするのに十分ですか?はいの場合、私はそのクエリと少し混乱しています...誰か助けてください?

4

8 に答える 8

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でuserを使用します...結合の詳細はこちら

于 2013-03-13T14:15:31.763 に答える
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

ユーザーは中国を旅行していない - 2012

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

出力

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

2012 年に中国を旅行しないユーザーのSQL Fiddle デモ

これまでにUNを旅行したクライアントのリスト

SELECT DISTINCT USER
  FROM travel_data
  WHERE id=NULL

これまでに旅行したことのないクライアントのリストのSQL Fiddle デモ

于 2013-03-13T12:35:58.313 に答える
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 に答える
0

これを試して

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