2017-05-04 53 views
0

我在嘗試計算用戶觸發了以下查詢的次數。我已經斷定子查詢是必需的。 以下(不可否認)查詢的工作,只要它去,沒有子查詢。子查詢作爲獨立查詢。但經過三天的嘗試,我無法讓這兩個人合併工作。我不知道我是否有明顯的語法錯誤,或者我是否在原則上得到了所有錯誤。我需要幫助!MySQL子查詢難度

SELECT id, status, FirstName, LastName, Track, KeyChange, Version, 
DATE_FORMAT(CONVERT_TZ(Created,'+00:00','+1:00'), '%l:%i %p') AS Created_formatted, 
TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, pinknoise.Created, CURRENT_TIMESTAMP() - INTERVAL '0' HOUR)),'%Hh %im') AS elapsed, 
(SELECT `FirstName`, Count(*) AS 'CountRequests' FROM `pinknoise` GROUP by `FirstName`) 
FROM pinknoise 
WHERE status = 'incoming' 
ORDER BY Created DESC 
+0

對於初學者來說,你需要經過逗號「AS過去了。」另外,你的意思是「我無法使用它?」有錯誤消息嗎?結果不是你所期望的嗎? – ghenghy

+0

MySQL通常*非常*特定錯誤的位置。請仔細注意錯誤信息的確切用詞。 – tadman

+0

啊是的,AS過後需要一個逗號。謝謝。但這不是唯一的錯誤,因爲以前的嘗試包含逗號。至於「不工作」 - 它會返回一個完全空的結果集! – user3317371

回答

0

我真的不明白你的查詢應該達到什麼樣的,但良好的格式化,它看起來像:

SELECT 
    id, 
    status, 
    FirstName, 
    LastName, 
    Track, 
    KeyChange, 
    Version, 
    DATE_FORMAT(
     CONVERT_TZ(
      Created, 
      '+00:00', 
      '+1:00' 
     ), 
     '%l:%i %p' 
    ) AS Created_formatted, 
    TIME_FORMAT(
     SEC_TO_TIME(
      TIMESTAMPDIFF(
       SECOND, 
       pinknoise.Created, 
       CURRENT_TIMESTAMP() - INTERVAL '0' HOUR 
      ) 
     ), 
     '%Hh %im' 
    ) AS elapsed 
    (
     SELECT 
      `FirstName`, 
      Count(*) AS 'CountRequests' 
     FROM 
      `pinknoise` 
     GROUP by 
      `FirstName` 
    ) 
FROM 
    pinknoise 
WHERE 
    status = 'incoming' 
ORDER BY 
    Created DESC 

我想什麼:你想總條目數在這個特殊的名字同一張桌子。骯髒的方法是:

SELECT 
    id, 
    status, 
    FirstName, 
    LastName, 
    Track, 
    KeyChange, 
    Version, 
    DATE_FORMAT(
     CONVERT_TZ(
      Created, 
      '+00:00', 
      '+1:00' 
     ), 
     '%l:%i %p' 
    ) AS Created_formatted, 
    TIME_FORMAT(
     SEC_TO_TIME(
      TIMESTAMPDIFF(
       SECOND, 
       pinknoise.Created, 
       CURRENT_TIMESTAMP() - INTERVAL '0' HOUR 
      ) 
     ), 
     '%Hh %im' 
    ) AS elapsed, 
    (
     SELECT 
      Count(*) 
     FROM 
      `pinknoise` AS tb 
     WHERE 
      tb.FirstName = pinknoise.FirstName 
    ) AS CountRequests 
FROM 
    pinknoise 
WHERE 
    status = 'incoming' 
ORDER BY 
    Created DESC 

一個更好的性能將有一個連接:

SELECT 
    pinknoise.id, 
    pinknoise.status, 
    pinknoise.FirstName, 
    pinknoise.LastName, 
    pinknoise.Track, 
    pinknoise.KeyChange, 
    pinknoise.Version, 
    DATE_FORMAT(
     CONVERT_TZ(
      pinknoise.Created, 
      '+00:00', 
      '+1:00' 
     ), 
     '%l:%i %p' 
    ) AS Created_formatted, 
    TIME_FORMAT(
     SEC_TO_TIME(
      TIMESTAMPDIFF(
       SECOND, 
       pinknoise.Created, 
       CURRENT_TIMESTAMP() - INTERVAL '0' HOUR 
      ) 
     ), 
     '%Hh %im' 
    ) AS elapsed, 
    tabA.CountRequests 
FROM 
    pinknoise 
INNER JOIN 
    (
     SELECT 
      Count(*) AS 'CountRequests', 
      FirstName 
     FROM 
      `pinknoise` 
     GROUP BY 
      FirstName 
    ) tabA 
ON 
    pinknoise.FirstName = tabA.FirstName 
WHERE 
    status = 'incoming' 
ORDER BY 
    Created DESC 
+0

這幾乎是我發佈的內容,但你是第一個。對於那個很抱歉。如果這是正確的答案,信貸應該給你。 – ghenghy

+0

@ghenghy在我完成我的長篇文章之後,我也看到了你的回答。但我認爲我們認爲正確的方法;-) –

0

你的子查詢中選擇部分返回2個值,其中只希望一個值。我猜你正在獲取FirstName以進行連接。如果是的話,那就試試這個:

SELECT 
    p.id, 
    p.status, 
    p.FirstName, 
    p.LastName, 
    p.Track, 
    p.KeyChange, 
    p.Version, 
    DATE_FORMAT(CONVERT_TZ(p.Created,'+00:00','+1:00'), '%l:%i %p') AS Created_formatted, 
    TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, p.Created, CURRENT_TIMESTAMP() - INTERVAL '0' HOUR)),'%Hh %im') AS elapsed, 
    cnt.CountRequests 
FROM 
    pinknoise p 
    inner join (SELECT p.FirstName, Count(*) AS CountRequests FROM pinknoise p GROUP by p.FirstName) cnt on p.FirstName = cnt.FirstName 
WHERE 
    p.status = 'incoming' 
ORDER BY 
    p.Created DESC; 
+0

非常感謝您的幫助,迄今爲止 - 你們所有人。目前我被困在一個狡猾的公共連接中,測試並不容易。但是你們的人都很出色,我相信你們那些聰明的'整潔的人'會幫助我。如果沒有,我會在明天再次哭泣! – user3317371

+0

嘿chaps。我剛剛得到這個飛行!請告知誰獲得信用?這是飛行的答案,但我看到評論表明馬塞爾首先發布。無論哪種方式,非常感謝。請讓我知道誰欠了綠色的勾號。 – user3317371

+0

我認爲這是相同的答案,馬塞爾第一次得到它。所以我會把它給他。 – ghenghy