簡體   English   中英

在子查詢中使用mySQL變量

[英]Using mySQL variables in subqueries

我試圖使用用戶定義的變量來限制子查詢的結果,以獲取某些分析數據中兩個時間戳之間的差異。 我正在使用的代碼如下:

SELECT  @visitID := `s`.`visit_id` AS `visit_id`,                             # Get the visit ID and assign to a variable
        @dt :=      `s`.`dt` AS `visit`,                                      # Get the timestamp of the visit and assign to a variable
                    `tmp`.`dt` AS `next-visit`                                # Get the 'next visit' timestamp which should be returned by the subquery

FROM `wp_slim_stats` AS `s`                                                   # From the main table...

LEFT JOIN (SELECT   `s`.`visit_id`,                                           # Start the subquery 
                    MIN(`s`.`dt`) as `dt`                                     # Get the lowest timestamp returned
               FROM `wp_slim_stats` AS `s`                                    # ...from the same table
               WHERE    `s`.`visit_id` = @visitID                             # Visit ID should be the same as the row the main query is working on
                   AND  `s`.`dt` > @dt                                        # Timestamp should be HIGHER than the row we are working on
               LIMIT 0, 1) as `tmp` ON `tmp`.`visit_id` = `s`.`visit_id`      # Join on visit_id

WHERE `s`.`resource` LIKE 'foo%'                                              # Limit all results to the page we are looking for

目的是獲取單個網頁瀏覽量並記錄其訪問ID和時間戳。 然后,子查詢應從數據庫返回具有相同訪問ID的一條記錄。 然后,我可以從另一個減去一個,以獲得花費在頁面上的秒數。

我遇到的問題是,子查詢似乎正在對返回的每一行進行重新評估,並且直到最后才填充next-visit列。 這意味着,返回的所有行是針對子查詢的結果匹配的最后一行,因此,所有的next-visitnull距最后一行。

我正在尋找的結果將是這樣的:

_________________________________________________
| visit_id     |     visit     |      next-visit|
|--------------|---------------|----------------|
|      1       | 123456789     |  123457890     |
|--------------|---------------|----------------|
|      4       | 234567890     |  234567891     |
|--------------|---------------|----------------|
|      6       | 345678901     |  345678902     |
|--------------|---------------|----------------|
|      8       | 456789012     |  456789013     |
|______________|_______________|________________|

但是我越來越

_________________________________________________
| visit_id     |     visit     |      next-visit|
|--------------|---------------|----------------|
|      1       | 123456789     |  NULL          |
|--------------|---------------|----------------|
|      4       | 234567890     |  NULL          |
|--------------|---------------|----------------|
|      6       | 345678901     |  NULL          |
|--------------|---------------|----------------|
|      8       | 456789012     |  456789013     |
|______________|_______________|________________|

對於在MySQL中使用變量,我還是一個新手,特別是在動態分配變量時。 如前所述,我認為我正在弄亂某個地方的操作順序,這導致子查詢在最后重新填充每一行。

理想情況下,由於來自客戶端的限制,我需要能夠在純mySQL中執行此操作,因此不幸的是沒有PHP。 可以做我想做的事嗎?

謝謝!

您根本不需要這里的變量。

SELECT `s`.`visit_id` AS `visit_id`,                          
       `s`.`dt` AS `visit`,                                   
        (SELECT MIN(dt) FROM `wp_slim_stats` ws WHERE ws.visit_id = s.visit_id AND ws.dt > s.dt)
FROM `wp_slim_stats` AS `s`                                                
WHERE `s`.`resource` LIKE 'foo%'

並回答為什么您的解決方案無法正常工作,請查看sql查詢中的操作順序:

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

這是您需要運行的查詢。

從訪問內部聯接中選擇visits.visitid作為vId,將temp.time作為tTime,將visits.time作為vTime(將min(id)選擇為firstId,visitid,從visits v1按訪問ID分組的時間)其中id> temps.firstid按visits.visitid分組;

看到這個SQL小提琴

暫無
暫無

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

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