2014-10-17 2 views
-1

В настоящее время у меня есть таблица с 1 100 000 строк, которая содержит данные пользователя.Выполнение запроса на результат запроса? (PHP + SQL)

Ее формат вроде этого:

User_Id Date Action 

мне было интересно, вместо того чтобы искать каждый раз на всю таблицу для действий, которые были сделаны конкретным пользователем на конкретную дату, выполнив следующие действия :

SELECT Action FROM USERS_TABLE WHERE Date=08092014 AND User_Id=5 

SELECT Action FROM USERS_TABLE WHERE Date=09092014 AND User_Id=5 

SELECT Date FROM USERS_TABLE WHERE Action="Shopping" AND User_Id=5 

SELECT Date FROM USERS_TABLE WHERE Action="Eating" AND User_Id=5 

т.д.

может быть, я мог бы сделать что-то вроде этого:

SELECT * FROM USERS_TABLE WHERE User_Id=5 

И на вершине результатов, этот запрос, я мог бы выполнить приведенные выше вопросы, которые я думаю, приведет к более быстрое время выполнения (поправьте меня, если я ошибаюсь)

ли вы, ребята, знаете, как это сделать?

+0

Да, я знаю, как это сделать ... но что вы просите? Методы? PHP-код? –

+0

На самом деле, вся причина существования сервера mysql заключается в том, чтобы как можно быстрее выполнять поиск по нескольким столбцам. Просто позвольте человеку выполнять свою работу и придерживаться первого решения. Вы можете добавить индексы, если они замедлятся. – ToBe

+0

@JoeSwindell Оба, если возможно :) – user3146699

ответ

0

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

SELECT * 
FROM USERS_TABLE 
WHERE (Date = 09092014 OR Date = 08092014) 
AND (Action="Shopping" OR Action="Eating") 
AND User_Id = 5 
+1

Я сомневаюсь, что это сократит время выполнения запросов. Я не прав? – user3146699

+1

Вам нужно будет протестировать, но вы можете увеличить время выполнения с правильной индексацией ваших таблиц @ user3146699 –

0

Я предполагаю, что у вас есть таблица с уникальными идентификаторами пользователей. если вы этого не сделаете, вы можете это рассмотреть? Как управлять профилем, если для одного пользователя нет отдельной записи? в любом случае, это не мое дело, но давайте предположим, у вас есть такая таблица, с unique поле с User_Id

он назвал USERS здесь

SELECT Action,Date 
FROM USERS 
LEFT JOIN USERS_TABLE AS Actions 
    ON (Actions.User_Id=USERS.User_Id AND Date IN (08092014,09092014)) 
LEFT JOIN USERS_TABLE AS Dates 
    ON (Dates.User_Id=USERS.User_Id AND Action IN ("Shopping","Eating")) 
WHERE USERS.User_Id=5 

обязательно указательным user_id, дата и действий, так как мы поиск по ним.

0

Я хотел бы сделать перекрестный запрос, после того, как я проиндексировал столбец user_id -

SELECT `Date`, 
SUM(IF(`Action` = 'Eating', 1, 0)) AS `Eating`, 
SUM(IF(`Action` = 'Shopping', 1, 0)) AS `Shopping` 
FROM `USERS_TABLE` 
WHERE `User_Id` = 5 
GROUP BY `Date` 

Вы получите результат, как это -

+-------------+---------------+----------+ 
    Date   Eating   Shopping  
+-------------+---------------+----------+ 
    2002-03-01    59   72 
    2002-03-02    28   0 
    2002-03-03    22   17 
    2002-03-04    36   13 
    2002-03-06    12   0 
+-------------+---------------+----------+ 

Для целесообразности я мог бы хранить эти данные в temp table (с столбцом идентификатора пользователя). Это можно изменить, чтобы принять диапазоны дат и другие ограничения. Это дает мне дополнительную гибкость по линии, когда мне нужно агрегировать дату от нескольких пользователей.

0

Я думаю, что вы имеете в виду отвечает этим:

select action, actiondate 
from 
(select * 
from USERS_TABLE 
where user_id = 5) as filter 

скрипку here.

Производная таблица в основном действует как фильтр, который вы описываете.

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

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