2013-01-25 67 views
1

將MySQL數據包含在MySQL結果中是可能的?讓我來解釋一下自己:在mysql查詢中包含php變量結果

兩個表,一個用戶的操作和一個用戶信息。我想查詢的操作和檢索用戶ID和計數每一個用戶分組:

$ids = $conn->fetchAll('SELECT origin,COUNT(*) as actions from action WHERE `brand` = ' . $id . ' AND SUBSTRING(origin,1,3)<>"pct" GROUP BY origin'); 

然後我把這個結果數組並用它來輸入用戶信息,從另一個表:

$norm_ids = '('; 
foreach ($ids as $ids) { 
    $norm_ids .= $ids['origin'] .','; 
} 
$norm_ids = substr_replace($norm_ids ,"",-1) .')'; 

$users = $conn->fetchAll('SELECT * from userinfo WHERE `id` in ' . $norm_ids . ' ORDER BY `name`'); 

我想在$users包括COUNT(*)我在上一個查詢中,是否可以直接查詢?

+0

是的,它shuld工作。你有沒有嘗試過? –

+0

如何使用過程或視圖來自定義結果集 –

回答

0

我已經作出了自己的腳本,我想這是你正在尋找:

$sql = "SELECT * FROM user WHERE Username = '".$_SESSION['Username']."' "; 
$stm = $db->prepare($sql); 
$result = $stm->execute(array()); 
while($row = $stm->fetch(PDO::FETCH_ASSOC)) { 
$userid = $row['UserID']; 
} 

在這裏我得到的用戶ID

$sql = "SELECT activity.*"."FROM user_activity, activity "."WHERE user_activity.ActivityID = activity.ActivityID AND user_activity.UserID = '".$userid."' " ; 

這裏u使用的$用戶ID在我查詢。

0

您可以使用MySQL連接爲:

SELECT u.*, count(a.origin) FROM userinfo AS u LEFT JOIN action AS a ON a.origin = u.id WHERE a.brand = '.$id.' AND SUBSTRING(a.origin,1,3) <> "pct" GROUP BY a.origin 

你必須嘗試和調整它一點點(可能),但它可能使你的腳本輕鬆了許多。 (我不確定用戶信息是否會被組合在一起(可能不應該))。

使用JOIN時,您必須設置正確的索引以獲得最佳性能。

0

首先,在一般的代碼幾點意見:

foreach ($ids as $ids) 

這只是看起來錯了,我不知道PHP如何處理這個,但可能並不像你期望的那樣。爲了清楚起見,使用不同的變量名稱。

您需要在查詢中繞過「pct」的引號,以便它們不會被PHP解析。

另外,我不知道$ id從哪裏來的第一個SQL語句,但您可能想要轉義它。使用PDO:

$stmt = $conn->prepare("SELECT origin,COUNT(*) as actions from action WHERE `brand` = :id AND SUBSTRING(origin,1,3)<>\"pct\" GROUP BY origin"); 
$stmt->execute(array(":id" => $id)); 
$ids = stmt->fetchAll(); 

要訪問COUNT(*)數據,並將其添加到用戶信息,I'ld第一查詢首先將其重命名(不要在我的數組鍵,如特殊字符):

"SELECT origin,COUNT(*) as nummatches as actions from action WHERE `brand` = :id AND SUBSTRING(origin,1,3)<>\"pct\" GROUP BY origin" 

然後,您可以在第二個查詢其添加到您的語句的SELECT部分​​:

'SELECT *,' . $ids['nummatches'] . ' from userinfo WHERE `id` in ' . $norm_ids . ' ORDER BY `name`'