【问题标题】:Fetch rows and check if has same value获取行并检查是否具有相同的值
【发布时间】:2018-11-20 03:04:26
【问题描述】:

我对编码和尝试学习 PHP 和 MYSQL 非常陌生。我正在尝试做的是,将相同的 CustomerID 查询分组到同一个表中,同时进行回显。目前,我的代码回显了所有单独的查询。我有一张像

ID      CustomerID     DATE        Company
1           1       2018-11-19        A
2           1       2018-11-19        A
3           2       2018-11-19        B
4           3       2018-11-19        C
5           4       2018-11-19        D
6           4       2018-11-19        D

我的代码

$query = "SELECT `customers`.ID, `customers`.customerid, `customers`.date
        FROM `customers` WHERE month(DATE)= month(CURRENT_DATE()) AND YEAR(DATE) = YEAR(CURRENT_DATE());

$result = $mysqli->query($query);

while($resultquery = $result->fetch_array())

{
$queryresult[] = $resultquery;

}
if (!empty($queryresult)) {

foreach($queryresult as $queryresults)
{

$id = $queryresults['id'];
$customerid = $queryresults['customerid'];  
$date = $queryresults['date'];
?>

然后我回显它,结果是

Company Name: A
ID CustomerID DATE
1      1    2018-11-19

Company Name: A
ID CustomerID DATE
2      1    2018-11-19

Company Name: B
ID CustomerID DATE
3      2    2018-11-19

Company Name: C
ID CustomerID DATE
4      3    2018-11-19

<?php }} ?>

等等。

但我想要的是比较 customerID,如果有多个具有相同 id 的,则将它们作为一个组在表中回显。

Company Name: A
ID CustomerID DATE
1      1    2018-11-19
2      1    2018-11-19

Company Name: B
ID CustomerID DATE
3      2    2018-11-19

Company Name: C
ID CustomerID DATE
4      3    2018-11-19

我使用 GROUP_CONCAT 进行了一个 sql 查询,并使用 SEPARATOR '|') 对结果进行分组,它可以工作,但我认为它不是实现这一目标的最佳方法,所以请帮忙。谢谢

【问题讨论】:

  • 您的查询包含语法错误;缺少的结束语。这只是一个糟糕的粘贴吗?
  • 您可以将结果存储在基于customerid 的数组中,即$queryresult[$resultquery['customerid'][] = $resultquery;。然后你可以循环这些来创建你的组
  • @FunkFortyNiner 是的。我的文件中有结束语。
  • @Sean 你能用解释重写我的代码吗?我不知道如何准确循环并从中获取数据。谢谢
  • 我没有看到你的任何代码超过foreach($queryresult as $queryresults) {,所以我不知道如何重新编写代码。我看不出Company Name: A 来自哪里

标签: php mysql compare fetch


【解决方案1】:

将您的数据映射到以 Company 为键的键值数组中(在查询中包括公司:

$query = "选择customers.ID,customers.customerid,customers.date,公司 FROM customers WHERE month(DATE)= month(CURRENT_DATE()) AND YEAR(DATE) = YEAR(CURRENT_DATE())";

$query = "SELECT `customers`.ID, `customers`.customerid, `customers`.date
        FROM `customers` WHERE month(DATE)= month(CURRENT_DATE()) AND YEAR(DATE) = YEAR(CURRENT_DATE());

然后使用键对项目进行分组来简化数据收集:

$result = $mysqli->query($query);
$queryresult = [];
while($resultquery = $result->fetch_array())

{
 $company = $resultquery['company'];
 if (array_key_exists($company,$queryresult){
   @$queryresult[$company] = [];
 }
 @$queryresult[$company][] = $resultquery;

}

然后您可以使用 foreach 呈现信息:

foreach($queryresult as $company => $items){
   // header by company
   echo "Company Name: $company \n";
   echo "ID CustomerID DATE\n";
   foreach($items as $item){
     // items in company
     echo "{$item['id']} {$item['customerid']} {$item['date']}\n"; 
  }

}

【讨论】:

  • 感谢您的帮助,但我得到了那个错误;警告:report.php 第 54 行的非法偏移类型 $queryresult[$resultquery['group'][] = $resultquery;
  • 您可以在@$queryresult[$company][] = $resultquery; 处添加@ 以避免出现此警告。这是因为您正在为每个组创建一个新的不存在的密钥。否则,您可以进行密钥检查。我更新了示例代码。
  • 代码现在可以工作了我在实现它时犯了一个错误,尽管它没有对公司进行分组。它没有显示同一公司的第二个查询。应该有5个记录输出,2个A公司,1个B,2个C,1个D,但它就像A1 B1 C1 D1
  • 我改变了 if (array_key_exists($company,$queryresult)) { @$queryresult[$company] = [];到 if (array_key_exists($customerid,$queryresult)) { @$queryresult[$customerid] = [];现在可以了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2021-03-24
  • 2012-07-01
  • 1970-01-01
  • 2014-02-03
  • 2020-05-27
  • 1970-01-01
相关资源
最近更新 更多