0

一部の分析データで 2 つのタイムスタンプの違いを取得するために、ユーザー定義変数を使用してサブクエリの結果を制限しようとしています。私が使用しているコードは次のとおりです。

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-visit列はnull最終行から離れています。

私が探している結果は次のようになります。

_________________________________________________
| 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 はありません。私がやろうとしていることをすることは可能ですか?

ありがとうございました!

4

2 に答える 2

1

ここでは変数はまったく必要ありません。

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 句
于 2013-08-30T08:59:13.417 に答える