2013-01-25 44 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`'