簡體   English   中英

如何編寫mysql查詢以返回比較同一表的行的結果?

[英]How to write a mysql query to return result comparing rows of same table?

我有一個表格結構,如下圖所示。 基本上,它有用戶ID lke u1,u2,他們將在給定日期在給定的考試中心/地點以給定的班次(如班次1,班次2等)進行考試,例如E1,E2等。每天最多有4個班次輪班編號 從1到4

給定該表,我需要找出同一用戶在同一日期和中心但連續輪班進行考試的行。 例如,紅色行在圖像中高亮顯示,其中U1在同一中心進行兩次考試,但以連續班次(即1和2)進行。有可能用戶連續4天在一天之內進行最多4次考試。

我要寫的另一個查詢是,如果同一用戶在同一日期但在不同中心進行兩次或多次考試。 行以藍色突出顯示。

在此處輸入圖片說明

請試試...

SELECT tblExams.srNum AS srNum,
       tblExams.user_id AS user_id,
       tblExams.exam_id AS exam_id,
       tblExams.exam_date AS exam_date,
       tblExams.exam_center_id AS exam_center_id,
       tblExams.exam_shift as exam_shift
FROM tblExams
JOIN
{
    SELECT user_id AS user_id,
           exam_date AS exam_date,
           exam_center_id AS exam_center_id,
           COUNT( exam_center_id ) AS exam_center_id_count
    FROM tblExams
    GROUP BY user_id,
             exam_date,
             exam_center_id
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id
                     AND tblExams.exam_date = exam_center_counter.exam_date
                     AND tblExams.exam_center_id = exam_center_counter.exam_center_id
WHERE exam_center_counter.exam_center_id_count >= 2;

我對您的問題的解釋方式是,您要查詢user the same datesame center進行2 or more exams記錄。 在我看來, User是最主要的因素,在該Exam Date之內,在各CentersExams count之內。 因此,我內部的SELECT語句中的GROUP BYCOUNT()行。

之所以存在其他三個選定字段,部分是因為GROUP BY使用了它們,因此要求它們成為SELECT一部分,一部分是因為需要它們與tblExams一起形成INNER JOIN (我為您的數據表假定的名稱) 。 (注意:如果單詞JOIN前面沒有JOIN類型,則執行INNER JOIN )。

INNER JOIN的作用是將該User在該Date在該Exam Center進行的考試數量附加到相應行上。

然后,我們要做的就是從tblExams每一行中選擇所有字段,該字段的計數至少為2

當我為您的第二個查詢構造以下代碼時,使用了這種邏輯的變體...

SELECT tblExams.srNum AS srNum,
       tblExams.user_id AS user_id,
       tblExams.exam_id AS exam_id,
       tblExams.exam_date AS exam_date,
       tblExams.exam_center_id AS exam_center_id,
       tblExams.exam_shift as exam_shift
FROM tblExams
JOIN
{
    SELECT user_id AS user_id,
           exam_date AS exam_date,
           COUNT( exam_center_id ) AS exam_center_count
    FROM
    {
        SELECT user_id AS user_id,
               exam_date AS exam_date,
               exam_center_id AS exam_center_id
        FROM tblExams
        GROUP BY user_id,
                 exam_date,
                 exam_center_id
    } exam_center_id_grouper
    GROUP BY user_id,
             exam_date
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id
                     AND tblExams.exam_date = exam_center_counter.exam_date
WHERE exam_center_counter.exam_center_count >= 2;

在此查詢中,我使用最里面的SELECT語句獲取每個User在各個Dates參加的Exam Centers列表。

然后,最中間的SELECT語句將使用此數據來形成一個列表,該列表列出了每個User在每個DATE參加Exam Centers

最外面的SELECT使用此計數來僅返回tblExams中符合指定條件的那些行。

如果您有任何問題或意見,請隨時發表評論。

暫無
暫無

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

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