使用-PHP

时间:2016-05-12 02:36:13

标签: php mysql

这是来自mysql的tblRecords。

ID ---- Name ---- Remark1 ---- Remark2
1       Dead        ok           -
1       Dead        -            ok

当我从tblRecords调用数据时,我想显示像这样的输出

ID ---- Name ---- Remark1 ---- Remark2
1       Dead        ok           ok

请帮助我成为编程新手。谢谢!

2 个答案:

答案 0 :(得分:2)

这可能对你有用;)

SQL Fiddle

MySQL 5.6架构

CREATE TABLE tblRecords
    (`ID` int, `Name` varchar(4), `Remark1` varchar(4), `Remark2` varchar(4))
;

INSERT INTO tblRecords
    (`ID`, `Name`, `Remark1`, `Remark2`)
VALUES
    (1, 'Dead', 'ok', '-'),
    (1, 'Dead', '-', 'ok')
;

查询1

select ID,Name,max(Remark1) as Remark1 ,max(Remark2) as Remark2
from tblRecords
group by ID,Name

<强> Results

| ID | Name | Remark1 | Remark2 |
|----|------|---------|---------|
|  1 | Dead |      ok |      ok |

答案 1 :(得分:1)

如果您指的是字符-本身,则查询可能如下所示:

SELECT r.ID, r.Name,
IF (r1.Remark1, r1.Remark1, r.Remark1) AS Remark1,
IF (r2.Remark2, r2.Remark2, r.Remark2) AS Remark2
FROM tblRecords r
LEFT JOIN tblRecords r1 ON r1.ID = r.ID AND r1.Remark1 != '-'
LEFT JOIN tblRecords r2 ON r2.ID = r.ID AND r2.Remark2 != '-'
GROUP BY 1;

这里我们join表(r)与自己2次:   - 从Remark1收集非破折号r1   - 从Remark2

收集非破折号r2

您可以使用MAX(Remark1)MAX(Remark2)按照其他答案的建议,如果您不关心是否有与'ok'不同的内容,例如'looks ok' , 例如。否则,你必须实现一些逻辑。不知何故,我认为您的应用程序的逻辑意味着不同的状态,或者您可以在将来添加一些状态。

此外,即使为数据库中的每个案例创建了索引,上面的查询也很慢。而它的&#39;如果没有备注列的索引,则速度极慢。

因此,我建议在PHP中实现逻辑。这将简化并加快查询速度。此外,存储引擎不应该做很多应用程序逻辑。

假设Db是一个数据库抽象层,它连接到数据库,如果需要,Db::query()接受一个SQL字符串并返回mysqli_result个对象。然后代码可能如下所示

// You might want to add WHERE clause.
$r = Db::query("SELECT * FROM tblRecords");

$records = [];
$keys = ['Remark1', 'Remark2'];
while ($row = $r->fetch_assoc()) {
  $id = $row['ID'];

  if (! isset($records[$id])) {
    $records[$id] = $row;
    continue;
  }

  foreach ($keys as $k) {
    if ($row[$k] != '-' && $records[$id][$k] == '-') {
      $records[$id][$k] = $row[$k];
    }
  }
}

$r->free();

随着您的应用程序的增长,逻辑将变得更加复杂。相信我,你会很高兴逻辑在PHP中,而不是在SQL中。