[英]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.