2015-04-28 4 views
0

(Извините, если заголовок не так понятен).Проверить существующие строки для предсказания в одном запросе MYSQL

У меня есть таблица вроде этого (гораздо более сложный, но достаточно, чтобы объяснить, я думаю):

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, и я хотел бы знать, кто должен быть здесь.

Объяснение

Джон был здесь ОНТ здесь форты Jour, но был здесь 2 часа следующая -> мы можем предположить, что он здесь.

Mel был здесь первые два часа, но не третий. Поскольку это последний час до час = 4, мы можем предположить, что ее здесь не будет.

Смит был здесь первый час, но мы не знаем в течение следующих двух часов -> мы можем предположить, что он здесь.

Элтон не был здесь вторым часом -> поскольку это единственная информация, которую мы имеем, мы можем предположить, что его здесь не будет.

Что я делаю на самом деле

На самом деле, то, что я делаю, проверяя каждое имя, используя запрос, как это:

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

И извлечь первый результат строки.

Наконец вопрос

Мой вопрос ... я могу иметь это в один запросов MySQL? Это должно дать мне имя человека, который был в последний раз обнаружен не здесь и какой час было.

Результат:

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

Просто нашел ошибку:. * Джон был здесь 3 часа раньше -> мы можем предположить, что он здесь * должен быть * Джон не был здесь первый час, но здесь два следующих часа -> мы можем предположить, он здесь. * –

ответ

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; 
+0

Этот тоже работает для меня. Попробуем сделать какой-то тест, чтобы найти быстрый способ между двумя сообщениями! –

+0

Просто увидел комментарий: ваше право, некоторые псевдонимы ошибочны, но их легко исправить. –

+0

@Strawberry: Да, я испортил псевдонимы. Спасибо за указание на это. –

-1

Да, вам нужно будет использовать 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) 

В результате у вас есть две строки, одна строка человек, который не был здесь и ваш результат запроса. Надеюсь, это поможет вам.

+0

Я не вижу, как это помогает: - $ – Strawberry

0

Ваши объяснения гораздо сложнее, чем должно быть. Вам просто нужен статус, связанный с максимальным записанным часом для каждого пользователя.

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 | 
+----+-------+------+----------+ 
+0

Спасибо, этот работает! И мне очень нравится, как вы возобновили ситуацию !!! –

Смежные вопросы