2013-08-04 57 views
0

我有三个PHP数组,它们都具有相同的两个键:pIdname。阵列的名称是added,deleted & updated将数据库表中的分组值与关联数组进行比较

我想看起来像这样比较表:

id 
relationId 
pId 
name 
changeType 

该行由relationId分组,并且有可能是每relationId多个PID &名对。 changeType可以是added,deletedupdated

我想要的是能够运行来检查,如果一组pId 双(其中changeType数组名称相匹配),这三个阵列完全匹配,在表中存在一个单一的查询并返回relationId

这可能吗?


表:

+--------+----------------+---------+---------------+----------------+ 
| **id** | **relationId** | **pId** | **name** | **changeType** | 
+--------+----------------+---------+---------------+----------------+ 
| 1 |  1  | 1 |  Smith  |  added  | 
+--------+----------------+---------+---------------+----------------+ 
| 2 |  1  | 2 |  John  |  updated | 
+--------+----------------+---------+---------------+----------------+ 
| 3 |  1  | 3 |  Dexter |  deleted | 
+--------+----------------+---------+---------------+----------------+ 
| 4 |  1  | 4 | Heisenberg |  added  | 
+--------+----------------+---------+---------------+----------------+ 
| 5 |  2  | 4 | Heisenberg |  added  | 
+--------+----------------+---------+---------------+----------------+ 
| 6 |  2  | 3 |  Dexter |  updated | 
+--------+----------------+---------+---------------+----------------+ 
| 7 |  2  | 3 | Dexter Morgan |  updated | 
+--------+----------------+---------+---------------+----------------+ 

PHP阵列:

$added = array(
[1] = array(
    pId => 4, 
    name => 'Heisenberg' 
) 
) 

$deleted = array(
//Empty 
) 

$updated = array(
[1] = array(
    pId => 3, 
    name => 'Dexter' 
) 
[2] = array(
    pId => 3, 
    name => 'Dexter Morgan' 
) 
) 

当使用该阵列查询返回的relationId应该为2

+0

这是一个有点抽象。你能显示一些代码和一些示例数据吗? –

+0

是的,这很难解释,但我发布了一个例子。 –

回答

0

我解决了这个通过比较在表格中使用GROUP_CONCAT从数组中得到一个内爆字符串。由于您通常不能在WHERE条款中使用GROUP_CONCAT,因此我必须使用FROM子句做一个解决方法。

<?php 
    $s = ''; 
    foreach($updated as $u){ 
     $s .= $u['pId'] . $u['name'] . 'updated,'; 
    } 
    foreach($deleted as $d){ 
     $s .= $d['pId'] . $d['name'] . 'deleted,'; 
    } 
    foreach($added as $a){ 
     $s .= $a['pId'] . $a['name'] . 'added,'; 
    } 

    //remove last comma 
    $s = rtrim($s, ','); 

    $stmt = $mysqli -> prepare(" 
    SELECT 
     relationId 
     FROM (
      SELECT 
       relationId, 
       GROUP_CONCAT(pId, name, changeType ORDER BY changeType DESC, id ASC) AS personConcat 
      FROM 
       persons 
      GROUP BY relationId 
     ) x 
     WHERE personConcat = ? 
    "); 

    $stmt -> bind_param('s', $s); 
    $stmt -> execute(); 
?> 
相关问题