簡體   English   中英

加入3個表mysql php

[英]Join 3 tables mysql php

我不確定這個術語,但是我現在基本上像這樣保留了2張桌子:

Snippets Table
snippet_id PK
snippet_text

snippets_link_email_id Table
snippet_id * (Links to Snippets Table)
email_id * (Links to emails Table)

emails Table
email_id 
version_no

許多其他各種數據

因此,發生的事情是將日志解析並插入到電子郵件表中,每個記錄都包含有關日志文本,發現的錯誤以及有關用戶的各種信息的詳細信息。

我需要從每個日志獲取的主要信息是錯誤,每個唯一的錯誤都存儲在摘要表中。

由於可能有許多電子郵件具有相同的錯誤,因此我想運行以下查詢以查看有多少獨特錯誤:

$total_exception_check = mysql_query("SELECT * FROM snippets");
$total_exceptions = mysql_num_rows($total_exception_check);

while ($row = mysql_fetch_array($total_exception_check))
{
$i = $row['snippet_id'];
//Need to find total occurrences of this error

$feedback_query = mysql_query("SELECT * FROM snippets LEFT JOIN snippets_link_email_id ON snippets.snippet_id = snippets_link_email_id.snippet_id WHERE snippets_link_email_id.snippet_id = $i AND snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");
}
$tot_snippets = mysql_num_rows($feedback_query);

因此,我基本上遍歷了每個唯一的錯誤,然后搜索snippets_link_email_id表以查看記錄了該錯誤的次數,即,分析過的電子郵件中有該錯誤的次數。

tot_snippets告訴我每一個的總數。 太好了,我現在可以為每個錯誤及其記錄的次數建立一個表格。

但是,在電子郵件表中有很多信息,包括版本號,如果我想獲取全部唯一錯誤,而電子郵件表中的version_no值為= 2000怎么辦?

我將如何編輯此代碼以查看?

SELECT *
FROM snippets
LEFT JOIN snippets_link_email_id
    ON snippets.snippet_id = snippets_link_email_id.snippet_id
WHERE
    snippets_link_email_id.snippet_id = $i
    AND snippet_date BETWEEN
        CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR
        AND CURRENT_TIMESTAMP

我從其他類似的帖子中嘗試了此方法,但我想我已經走了幾步了:

 SELECT *
 FROM snippets, emails
 LEFT JOIN snippets_link_email_id
     ON snippets.snippet_id = snippets_link_email_id.snippet_id
     AND snippets_link_email_id.email_id ON emails.email_id
 WHERE snippets_link_email_id.snippet_id = $i
 AND snippet_date BETWEEN
     CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP

連接多個表的一般形式是

SELECT (columns or collations)
FROM table1
LEFT JOIN table2
ON (some condition that associates rows in table1 with rows in table2)
LEFT JOIN table3
ON (some condition that associates rows in table1 or table2 with rows in table3)
WHERE (whatever you want to limit the result set to)

無論您要聯接多少個表,都遵循相同的基本模式,但是如果使用大量表,則為它們加別名可能會使您的生活變得更輕松。

SELECT (columns or collations)
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON (some condition that associates rows in t1 with rows in t2)
LEFT JOIN table3 AS t3
ON (some condition that associates rows in t1 or t2 with rows in t3)
WHERE (whatever you want to limit the result set to)

正確加入電子郵件可以解決嗎?

 SELECT *
 FROM snippets
 LEFT JOIN snippets_link_email_id
 ON snippets.snippet_id = snippets_link_email_id.snippet_id
 LEFT JOIN emails
 ON snippets_link_email_id.email_id = emails.email_id
 WHERE snippets_link_email_id.snippet_id = $i
 AND snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");

另外,我注意到您的第一個查詢沒有使用時間戳。 那將返回比您真正需要的更多的行(我猜)。 您可以按時間戳過濾第一個查詢,然后循環會大大減小:

SELECT * FROM snippets
     WHERE snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");

暫無
暫無

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

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