【问题标题】:MySQL/PHP merge rows by row valuesMySQL/PHP 按行值合并行
【发布时间】:2018-01-26 18:43:58
【问题描述】:

我需要一些关于在 SQL 或 php 中选择 MySQL 的帮助。 我的情况: 我有一个这样的sql表

ID | organization_ID | Investment | investment_curr | paid | paid_curr | effective_from | Effective_to
1 | 195001 | 5000 | EUR | NULL | EUR | 2010-06-23 | NULL
2 | 195001 | NULL | EUR | 5000 | EUR | 2010-06-23 | NULL
3 | 195001 | 2000 | SKK | NULL | SKK | 2007-08-01 | 2010-06-22
4 | 195001 | NULL | SKK | 2000 | SKK | 2007-08-01 | 2010-06-22

现在我有 php select (joomla),当按组织 ID 选择值时

$query_rpo_organization_equity_entries = $db->getQuery(true);
$query_rpo_organization_equity_entries
    ->select(array('organization_id',
                                    'investment_amount',
                                    'investment_currency',
                                    'paid_amount',
                                    'paid_currency',
                                    'effective_from',
                                    'effective_to'
    ))
    ->from($db->quoteName('rpo_organization_equity_entries'))
    ->where($db->quoteName('organization_id') . ' = '. $db->quote($rpo_id))
    ->order(($db->quoteName('effective_to') . ' IS NOT NULL'), $db->quoteName('effective_to') . ' DESC ');
$db->setQuery($query_rpo_organization_equity_entries);
$query_rpo_organization_equity_entries = $db->loadObjectList();

然后我调用foreach

foreach($query_rpo_organization_equity_entries as $rpo_organization_equity_entries) {}

一切正常,但不是我需要的方式。这foreach 返回 4 个数组,但我需要按列“effective_from”和“effective_to”合并/组合行(如果它们具有相同的值。当然还有组织 ID)。 因此,我将 ID 为 1 和 2 的行以及 ID 为 3 和 4 的行组合在一起,而不是 4 个数组,我只有 2 个像这样的组合/合并数组

XY | 195001 | 5000 | EUR | 5000 | EUR | 2010-06-23 | NULL
XY | 195001 | 2000 | SKK | 2000 | SKK | 2007-08-01 | 2010-06-22

我应该怎么做?还是先解决sql再php更好?

谢谢

【问题讨论】:

标签: php mysql arrays select joomla


【解决方案1】:

你希望得到的结果可以通过 MySQL 使用 GROUP BY 函数来实现。

Joomla docs 中,他们对此非常清楚。您可以在对象上使用 group() 函数。

//Example
$query
->select( array('catid', 'COUNT(*)') )
->from($db->quoteName('#__content'))
->group($db->quoteName('catid'));

在您的情况下,您可能希望将代码更改为:

$query_rpo_organization_equity_entries = $db->getQuery(true);
$query_rpo_organization_equity_entries
    ->select(array('organization_id',
                                    'MAX(investment_amount)',
                                    'investment_currency',
                                    'MAX(paid_amount)',
                                    'paid_currency',
                                    'MAX(effective_from)',
                                    'MAX(effective_to)'
    ))
    ->from($db->quoteName('rpo_organization_equity_entries'))
    ->where($db->quoteName('organization_id') . ' = '. $db->quote($rpo_id))
    ->group('`organization_ID`, `effective_from`, `Effective_to`') //this is the one
    ->order(($db->quoteName('effective_to') . ' IS NOT NULL'), $db->quoteName('effective_to') . ' DESC ');
$db->setQuery($query_rpo_organization_equity_entries);
$query_rpo_organization_equity_entries = $db->loadObjectList();

我尚未对此进行测试,但其中的某些内容应该可以工作。

【讨论】:

  • 嗨,彼得。这不起作用。当我使用 group by 时,SQL 仅返回 ID 1 和 3(仅来自列投资的值,列支付为 NULL :()
  • 我的猜测是有可能超过 2 行匹配对吧?
  • 没有。每个组织 ID 都有偶数行,其中每对“已连接”并且在 Effective_from 和 Effective_to 中具有相同的日期。我不明白为什么数据库是这样完成的。我必须使用它。
  • 不确定$db 类在 Joomla 中的工作方式,但您可以在需要时为列选择 MAX 值,我已经更新了我的答案。
猜你喜欢
  • 2012-01-09
  • 2013-04-24
  • 2020-08-06
  • 2011-12-19
  • 2012-03-25
  • 2011-09-15
  • 1970-01-01
  • 2021-11-01
  • 2016-08-31
相关资源
最近更新 更多