日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

上次寫了一篇復雜SQL編寫框架以及步驟,寫出一個復雜的SQL步驟,但是有一個東西沒有提及,那就是隱藏條件。隱藏條件在寫SQL的時候往往會忽略,最終導致結果可能是錯誤的。因此當我們在梳理表字段的時候一定要注意,如果拿不準可以問下表相關的業務同事幫你來確定。

一、看需求

上午需要給領導提供一份訂單權限學員詳情數據,就是學員買了課且有權限上課的詳情數據。具體需求如下:

uid;學員姓名;權限課程名稱;是否新學員(繳10000為新學員,否則為否) 學員省份(表單省/電話號碼所在省);學員城市(表單市/電話號碼所在市);訂單所在公司名稱;訂單企業所在省份;訂單企業所在城市;班級號;班級所在人數;

二、分析

如果按照復雜SQL的編寫框架來看,先梳理字段要用到的表,再梳理關聯關系和條件,最后就是寫出各個子查詢,把他們拼接在一起就可以了。我們可以看下這個需求的字段要用到的表:

  1. user_right_course
uid;學員姓名;權限課程名稱;
  1. order
是否新學員(繳10000為新學員,否則為否)
  1. area
學員城市(表單市/電話號碼所在市);
訂單所在公司名稱;訂單企業所在省份;訂單企業所在城市;
  1. class
班級號;
  1. class_member
班級所在人數;

條件:

  1. order.user_id=area.user_id
  2. order.order_no=user_right_course.order_no
  3. class.id=order.class_id

寫出SQL

  SELECT 
  user_id,name,.......
  CASE
    WHEN order.real_fee = 10000 THEN '是'
    ELSE '否'
  END AS is_new_student,
  FROM 
  user_right_course
  LEFT JOIN 
  order ON order.order_no=user_right_course.order_no
  LEFT JOIN
  area on area.user_id=order.user_id
  LEFT JOIN
  class ON class.id=order.class_id
  LEFT JOIN
    (
        SELECT
            class_id,
            COUNT(id) AS class_size
        FROM
            class_member
        WHERE
            delete_flag=0
        GROUP BY
            class_id
  ) m ON m.class_id=class.id

這樣就萬事大吉了嗎,不是的。

  1. 首先有的表有刪除標記delete_flag,那么在關聯的時候得帶上,我們只要沒刪除的(delete_flag=0)。
  2. 其次訂單表有刪除,退款,正常等狀態,我們只要正常的訂單(status=2)。
  3. 最后看user_right_course這個訂單權限表,它有status=0/1(0:無權限,1:有權限)。

那么這些隱藏條件也得加上去;

三、最終SQL

SELECT 
  user_id,name,.......
  CASE
    WHEN o.real_fee = 10000 THEN '是'
    ELSE '否'
  END AS is_new_student,
  FROM 
  user_right_course
  LEFT JOIN 
  (
      SELECT
        order_no
      FROM 
        order
      WHERE
        status=2
  ) o ON o.order_no=user_right_course.order_no
  LEFT JOIN
  area on area.user_id=o.user_id
  LEFT JOIN
  class ON class.id=o.class_id
  LEFT JOIN
    (
        SELECT
            class_id,
            COUNT(id) AS class_size
        FROM
            class_member
        WHERE
            delete_flag=0
        GROUP BY
            class_id
  ) m ON m.class_id=class.id
  WHERE user_right_course.status=1 and user_right_course.delete_flag=0

四、總結

當然還有其他隱藏條件也需要去發現,比如班級有角色之分,我們這里只要學員,那么class表就不是單純的LEFT JOIN了,而得寫出子查詢,然后WHERE判斷role=學員。再就是有的條件需要深入到子查詢,比如course_id=10這門課程,只要涉及到的子查詢都應該將這個條件作為WHERE條件判斷。

這個過程需要持久的練習才能對隱藏條件更加敏感,所以寫的越多越容易能寫出復雜的SQL。

分享到:
標簽:SQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定