2014-10-17 80 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代碼? – 2014-10-17 15:05:46

+0

實際上,mysql服務器存在的全部原因是儘可能快地在多個列上搜索。只要讓這個人做他的工作,並堅持第一個解決方案。如果速度較慢,您可能需要添加指標。 – ToBe 2014-10-17 15:05:50

+0

@JoeSwindell如果可能的話:) – user3146699 2014-10-17 15:06:39

回答

0

您可以使用or將所有這些查詢合併爲一個查詢。

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

我懷疑這會減少查詢的執行時間..我錯了嗎? – user3146699 2014-10-17 15:10:44

+1

您必須測試,但是您可以通過對錶格進行適當的索引來增加執行時間@ user3146699 – 2014-10-17 15:20:53

0

我假設你有一個帶有唯一用戶ID的表格。如果你不這樣做,你可能會考慮它?如果單個用戶沒有單個條目,如何管理配置文件?反正這不是我的事,但我們只是假設你有這樣的表,其中的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 
+-------------+---------------+----------+ 

爲方便起見,我可能保存在這個數據臨時表(帶有用戶標識列)。這可以修改爲接受日期範圍和其他限制。當我需要從多個用戶彙總日期時,這爲我提供了一些額外的靈活性。

0

我想你的意思是這樣回答:

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

小提琴here

派生表基本上充當您描述的過濾器。

不管它會更快,很難預測 - 我會在生產系統上運行它,並查看查詢計劃的內容。