簡體   English   中英

在一個MYSQL請求中檢查現有行以進行預測

[英]Check existing rows for prediction in one MYSQL request

(很抱歉,標題不太清楚)。

我有一個這樣的表(復雜得多,但足以解釋我的想法):

id    name    hour    was_here
1     John    1       0
2     John    2       1
3     John    3       1
4     Mel     1       1
5     Mel     2       1
6     Mel     3       0
7     Smith   1       1
8     Elton   2       0

假設我現在是4點鍾 ,我想知道誰應該在這里。

說明

約翰在這里是要塞的地方,但是接下來的兩個小時在這里->我們可以假設他在這里。

梅爾在這里是前兩個小時,但不是第三個小時。 因為這是hour = 4之前的最后一個小時,所以我們可以假設她不會在這里。

史密斯一小時就在這里,但接下來的兩個小時我們不知道->我們可以假設他在這里。

Elton第二個小時不在這里->因為這是我們掌握的唯一信息,我們可以假設他不會在這里。

我實際上在做什么

實際上,我正在使用如下查詢來檢查每個名稱:

SELECT was_here FROM table WHERE name='$name' AND hour<4 ORDER BY hour DESC

然后提取第一行結果。

最后的問題

我的問題是...我可以在一個 mysql查詢中使用嗎? 它應該給我最后一次不在這里被發現的人的名字,以及現在的時間。

結果:

# -----------------
# name   |   hour
# -----------------
# Mel    |   3
# Elton  |   0
# -----------------

您想預測一個人是否會在這里。 准確制定規則很重要。 到目前為止,您的規則似乎是:

  • 如果我們最后得到的關於某人的信息是他/她在這里,我們希望他們仍然在這里。

每人的最新信息是沒有最新信息的信息。 預測是“將在這里”等於最后一個“在這里”:

select name, was_here as will_be_here
from mytable
where not exists
(
  select *
  from mytable newer_info
  where newer_info.name = mytable.name
  and newer_info.hour > mytable.hour
  and newer_info.hour < 4
)
and hour < 4;

您的解釋要復雜得多。 您只需要與每個用戶的最大記錄小時數相關聯的狀態。

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name    VARCHAR(12) NOT NULL
,hour    INT NOT NULL
,was_here INT NOT NULL
);


INSERT INTO my_table VALUES
(1     ,'John'    ,1       ,0),
(2     ,'John'    ,2       ,1),
(3     ,'John'    ,3       ,1),
(4     ,'Mel'     ,1       ,1),
(5     ,'Mel'     ,2       ,1),
(6     ,'Mel'     ,3       ,0),
(7     ,'Smith'   ,1       ,1),
(8     ,'Elton'   ,2       ,0);

SELECT x.*
  FROM my_table x
  JOIN
     ( SELECT name
            , MAX(hour) max_hour
         FROM my_table
        GROUP 
           BY name
     ) y
    ON y.name = x.name
   AND y.max_hour = x.hour;

+----+-------+------+----------+
| id | name  | hour | was_here |
+----+-------+------+----------+
|  3 | John  |    3 |        1 |
|  6 | Mel   |    3 |        0 |
|  7 | Smith |    1 |        1 |
|  8 | Elton |    2 |        0 |
+----+-------+------+----------+

是的,在這種情況下,您將需要使用UNION 您的查詢將如下所示:

(SELECT hour, was_here FROM table WHERE name='$name' AND hour<4 ORDER BY DESC LIMIT 1)
UNION
(SELECT hour, was_here FROM table WHERE name='$name' AND was_here = '0' ORDER BY DESC LIMIT 1)

結果,您有兩行,其中一行是不在這里的人以及您的查詢結果。 我希望這能幫到您。

暫無
暫無

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

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