簡體   English   中英

從MySQL表中選擇數據

[英]Select data from MySQL tables

我有2個名為table_onetable_two表,具有以下屬性:

  • 他們兩個都有一個稱為column_id公共列。
  • table_one.column_id的值是唯一的,而table_two.column_id的值不是唯一的。
  • table_two有兩個額外的列,分別稱為ts_onets_two ts_one不為null,但ts_two可以為null。 每個table_two.column_id僅一行,允許ts_two值為null。
  • 並非table_one.column_id所有值都可以顯示在table_two.column_id

例如:

table_one
column_id
1
2
3
4
5


table_two
column_id    ts_one        ts_two
2            2014-10-01    null
3            2014-10-02    2014-10-03
3            2014-10-05    null
4            2014-10-01    2014-10-05

我需要從table_one.column_id獲取所有ID,其中:

  1. table_one.column_id id而不是table_two.column_id中的id(1、5滿足該要求)
  2. ID在table_one.column_id和在table_two.column_id其中ts_two不為空並且存在與相同ID NO另一行,其中ts_two用空值- (僅4滿足)。

兩種情況都應考慮在內。 結果應包括1、4和5。

對於您的第一個問題“ id在table_one.column_id中而不在table_two.column_id(1,5)中”

這個查詢應該做

SELECT column_id 
FROM table_one AS o
WHERE NOT EXISTS (SELECT 1 FROM table_two WHERE column_id = o.column_id)

對於第二個問題“ table_one.column_id和table_two.column_id中的id,其中ts_two不為null且不存在具有null值的id-(僅4個)”

這個查詢也應該

SELECT t.* FROM table_two AS t 
INNER JOIN table_one AS o ON o.column_id = t.column_id
WHERE t.ts_two IS NOT NULL AND NOT EXISTS (SELECT 1 FROM table_two WHERE ts_two IS NULL AND column_id = o.column_id)

這個問題是如此令人困惑。 但是從下面的評論中,這應該可以為您提供所需的東西

SELECT DISTINCT  column_id
FROM (
SELECT column_id 
FROM table_one AS o
WHERE NOT EXISTS (SELECT 1 FROM table_two WHERE column_id = o.column_id)
UNION
SELECT t.column_id FROM table_two AS t 
INNER JOIN table_one AS o ON o.column_id = t.column_id
WHERE t.ts_two IS NOT NULL AND NOT EXISTS (SELECT 1 FROM table_two WHERE ts_two IS NULL AND column_id = o.column_id)
  ) AS t

更新的小提琴: http ://sqlfiddle.com/#!2/0b39d2/15/0

SELECT *
FROM Table_one A
LEFT JOIN Table_Two B
 on A.Column_ID = B.ColumN_ID
LEFT JOIN (Select column_ID 
           From table_two 
           where ts_one is null or ts_two is null) C
  ON A.ColumN_Id = C.Column_ID
WHERE C.Column_ID is null
OR B.Column_ID is Null;

這是做什么的:

  • 返回集合1中表1的所有數據
  • 從表2連接到不在1,5中的數據(將數據添加到集合1)
  • 從表2聯接到已被過濾為僅包括具有空值的記錄的數據(創建第二組)
  • 排除表2的第二次連接中存在匹配項的記錄。 (篩選數據,以便僅返回第一組中的數據,而不返回第二組中的數據。

您可以通過單個聯接和聚合來完成此操作。

SELECT t1.column_id FROM table_one AS t1
LEFT JOIN (
    SELECT column_id, (COUNT(column_id) = COUNT(ts_two)) as no_nulls FROM table_two
    GROUP BY column_id
) AS t2
ON t1.column_id = t2.column_id
WHERE t2.column_id IS NULL OR (t2.column_id IS NOT NULL AND t2.no_nulls = TRUE)

SQLFiddle: http ://sqlfiddle.com/#!2/14855/8/0

  1. 查詢表1中的所有內容
  2. 查詢表2中的每個ID,以及該ID是否具有任何ts_two空條目。
  3. 如果2中缺少1,或者1在2中並且沒有空ts_two條目,則將它們連接在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM