取多个领域一次

问题描述:

目前我的查询看起来像取多个领域一次

$stmt = $this->db->prepare('SELECT `body` FROM `messages` WHERE `id`=? AND `status'='success'); 
    $stmt->bind_param("i", $msgid); 
    $rc = $stmt->execute(); 
    $stmt->bind_result($message); 
    $stmt->fetch(); 
    $stmt->close(); 

比方说,$msgid是阵列(1,2,5,7)。是否有可能获取所有bodystatus字段其中id是1,2,5,7一次和合并所有body年代到由空格分隔一个变量?如果是,我该怎么办?

+0

你的意思是像'... WHERE id IN(1,2,5,7)''? – Quasdunk 2012-01-18 13:46:00

+0

@Quasdunk是的。假设'id 1'的'body'是'sample1'。 'id 2'是'sample2' ..等等。我想在一个变量中获得'sample1 sample2' – heron 2012-01-18 13:46:56

+0

我有一个问题。虽然可以将所有的身体合并到一个字符串,那么状态呢?它必须是什么形式? – 2012-01-18 14:00:42

GROUP_CONCAT - 下面的代码应该做你需要的与PDO。

$values = array(1, 2, 5, 7); 
$parameters = implode(',', str_split(str_repeat('?', count($values))); 

$stmt = $this->db->prepare(" 
    SELECT 
     GROUP_CONCAT(body SEPARATOR ' ') as gbody 
    FROM 
     messages 
    WHERE 
     id IN($parameters) 
     AND status='success' 
"); 
$stmt->execute($values); 
$res = $stmt->fetch(); 
echo $res['gbody']; 
$stmt->close(); 
+1

@ $ ValueCount = implode(',',array_fill(0,count($ values),'?'));';-) – 2012-01-19 11:01:28

+0

@ Col.Shrapnel:为什么array_fill会有帮助? :) – rasmusx 2012-01-19 11:28:49

+1

它会为你节省4行。四是因为在你当前的代码中你必须在循环之前添加'$ valueCount ='';'。所以,使用array_fill它将是一行而不是5。 – 2012-01-19 11:41:44

不知道这是可能的参数,但它很容易与内置SQL:

$imp=implode(',',$msgid); 
"SELECT `body`, `status` FROM `messages` WHERE `id` IN (0$imp)" 

的0后,开括号帮助您在的$ MSGID的障碍是一个空数组。

这是假设is_numeric($ MSGID [$ i])是所有有效$我真的,或者你失去了你的数据库...

+0

你能编辑我提供的代码吗? – heron 2012-01-18 13:49:53

+1

其实阅读我的答案的第一行会告诉你,我的解决方案不能使用参数。所以编辑你的代码不是一种选择。因为懒得阅读而下调是不礼貌的。 – 2012-01-18 13:52:27

没有,有地在语句没有占位符。 您必须编写一个简单的程序,它必须生成(?,?,?)字符串才能添加到查询中,然后将您的数组绑定到此查询。

好,它竟然是在一次问题:

  1. 如何查询多个条件
  2. 如何使用预处理语句
  3. 如何建立这样一个查询数据库取多行
  4. 如何在一个中取多个字段

但是似乎你不必短期答案,但书(或者更确切地说,二 - 基本的PHP和MySQL的基础之一),这里有供您参考

  1. 使用报表的答案。 SQL语句WHERE id IN(1, 2, 5, 7)将查询数据库中的所有id。
  2. 正如我上面写的,创建一个小程序,以产生(?,?,?)声明,用数组元素的?匹配数号码。比平常的方式。
  3. 我相信,execute()的手册页确实包含了一个获取多行的例子。我总是参考自己的例子手册。
  4. SQL函数group_concat()可以做到这一点。 select group_concat(body SEPARATOR ' ')将选择你所有的身体在一排
+0

是否可以将所有表作为数组提取,然后逐个获取确切的行? – heron 2012-01-18 13:51:14

+0

这个问题是无关紧要的。您的数据库API可以让您确实获取多行。你确定你不知道该怎么做? – 2012-01-18 13:54:57