这是来自mysql的tblRecords。
ID ---- Name ---- Remark1 ---- Remark2
1 Dead ok -
1 Dead - ok
当我从tblRecords调用数据时,我想显示像这样的输出
ID ---- Name ---- Remark1 ---- Remark2
1 Dead ok ok
请帮助我成为编程新手。谢谢!
答案 0 :(得分:2)
这可能对你有用;)
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中。