我使用Laravel进行MySQL查询,转换为PHP数组。
行的值与此类似:
name | override | percentage
Eclipse | 1 | 50%
Eclipse | 0 | 75%
MySQL查询
select * from table
这两行(它实际上只有2个)具有相同的名称,但是一个将覆盖设置为0,一个设置为1.
如何摆脱查询结果(PHP数组)中所有重复的记录(由名称确定)并将覆盖设置为0?我只想要使用我已经完成的新记录覆盖的记录,但是我需要一种方法来删除覆盖= 0的记录,因为记录是相同的但具有不同的百分比值。
如何做到这一点?
感谢。
答案 0 :(得分:1)
尝试以下查询,
SELECT * from testtable GROUP BY `name` HAVING count(`name`) = 1 OR `override` = 1;
检查此sqlfiddle
答案 1 :(得分:1)
如果我理解您的需求,您需要过滤掉名称重复且override = 0
的记录。
如果按name
(SELECT * FROM TABLE ORDER BY name
)对结果集进行排序,则可以使用此功能。
function removeDuplicatesFromArray($rows) {
$result = array();
$old_name = '';
foreach($rows as $row) {
if($row['name'] != $old_name) {
$result[] = $row;
$old_name = $row['name'];
}
elseif($row['override'] == 1) {
array_pop($result);
$result[] = $row;
}
}
return $result;
}
答案 2 :(得分:0)
注意:在SQL中执行此操作将更快地运行并且使用更少的内存。如果由于某种原因无法修改SQL,我只会尝试这种PHP方法。
也许试试......点击数据库两次,第一次只获取非覆盖,然后在第二次传递中获取覆盖 - 强制您的数组按名称和array_merge索引。 (考虑到数组和副本的数量,使用相当大的内存块 - 但它很容易理解并保持简单。
$initial = get_non_overridden();
$override = get_overridden();
$init_indexed = index_by_name($initial);
$over_indexed = index_by_name($override);
$desired_result = array_merge($init_indexed, $over_indexed);
假设您的数据库为您提供标准行集(行数组,其中每行是字段的哈希值>值)。我们想要一些看起来像这样的东西:
[
'Eclipse' => [
'name' => 'Eclipse',
'override' => '0',
'percentage' => '75%'
],
'Something' => [
'name' => 'Something',
'override' => '0',
'percentage' => '20%'
],
]
因此index_by_name将是:
function index_by_name($rowset) {
$result = array();
foreach ($rowset as $row) {
$result[ $row['name'] ] = $row;
}
return $result;
}
有很多方法可以在内存或运行时调整你的效率,但这就是我的想法。
array_merge然后用覆盖的那些覆盖初始的。
注意:这一切都假设只有一行Eclipse覆盖为1.如果你有二十个Eclipse | 0和一个Eclipse | 1,这将有效,如果你有两个Eclipse | 1你只能看到一个他们......并且没有办法说出哪一个。