【问题标题】:Merging rows of the same value together将相同值的行合并在一起
【发布时间】:2019-09-24 18:01:40
【问题描述】:

我有一个 ODBC 连接,我在 PHP 中执行查询。将 5 个表连接在一起以获取我需要的数据,并且只使用了 4 列或“选择”了 95 列。

问题是我多次获得相同的“用户名”和“管理”,因为每个用户在“permType”列和其他我目前没有使用的列中都有多个数据。 代码本身有效,唯一的问题是列的东西..


它是一个 SQL Server,使用 Microsoft SQL Server Management Studio,2008 R2

我尝试在 SQL 中使用“GROUP BY”对它们进行分组,但出现错误:

选择列表中的“ID”列无效,因为它不包含在内 在聚合函数或 GROUP BY 子句中。

我已经用谷歌搜索了这个错误,但我无法从我找到的答案中得到它。

感觉我已经尝试了我在 google/stackoverflow 上找到的所有内容。


表格现在看起来像这样:

名称 |管理 |烫发类型

约翰·多伊 |订购许可证 |电脑烫发
约翰·多伊 |订购许可证 |电话烫发
约翰·多伊 |订购许可证 |权限许可
灰Ketcu|一些订单 |电脑烫发
灰Ketcu|一些订单 |电话烫发
灰Ketcu|一些订单 |权限许可


但我希望它看起来像这样:

名称 |管理 |烫发类型

约翰·多伊 |订购许可证 | PC perm, Telephone perm, Permission Perm
灰Ketcu|一些订单 | PC perm, Telephone perm, Permission Perm


以下是部分代码:


**//I do odbc fetch, and echo out a table:**

while ($row = odbc_fetch_array($result)) {
 echo "<tr>";
    echo "<td>" . utf8_encode($row[$Firstname]) . " " . utf8_encode($row[$Lastname]) . "</td>";
    echo "<td>" . utf8_encode($row[$Management]) . "</td>";
    echo "<td>" . utf8_encode($row[$PermType] ). "</td>";
 echo "<tr>";
}


//The SQL:

SELECT
PT.NAME AS PERMTYPE,
R.MANAGE AS MANAGEMENT,
R.FIRST_NAME AS FIRSTNAME,
R.LAST_NAME AS LASTNAME

FROM WEBORDER_PRODUCTTYPESLINKS PL
INNER JOIN WEBORDER_PRODUCTTYPES PT ON PT.ID = PL.IDPRODUCTTYPE
INNER JOIN WEBORDER_INDIVIDUALPERM_TYPES IT ON IT.IDPRODUCTTYPE = PT.ID
INNER JOIN C_CONTACT_PERSONS R ON R.MASTER_ID = IT.IDMANAGER AND (R.CODE = 1)
where R.MANAGEMENT <> 'NULL' and PT.ID between 65 and 72


也许在 PHP 中有一个解决方案,而不是尝试在 SQL 中对它们进行分组,然后在 PHP 中呈现数据?

我很高兴有任何建议!


更新

设法取得了一些进展,现在唯一的问题是“PermType”列中的相同值显示了 100 次。 无法真正理解我在这里到底做错了什么..

This is what my table looks like right now:
+-----------+------------+-----------+---------------------------------+
| FIRSTNAME | LASTNAME   | MANAGEMENT| PermType                        |
+-----------+------------+-----------+---------------------------------+
| Ash Ketcu | SomeOrder  | SomeOrder | PC perm, PC permPC, PC permPC...|
| John Doe  | Orderperm  | Orderperm | PC perm, PC permPC, PC permPC...|
+-----------+------------+---------------------------------------------+

SELECT
R.FIRST_NAME,
R.LAST_NAME,
R.MANAGEMENT,
PERMTYPE = 
    (
    SELECT ', ' + PT.NAME
        FROM WEBORDER_PRODUCTTYPESLINKS PL
            INNER JOIN WEBORDER_PRODUCTTYPES PT ON PT.ID = PL.IDPRODUCTTYPE
            INNER JOIN WEBORDER_INDIVIDUALPERM_TYPES IT ON IT.IDPRODUCTTYPE = PT.ID
            INNER JOIN C_CONTACT_PERSONS R ON R.MASTER_ID = IT.IDMANAGER 
        WHERE PT.ID BETWEEN 65 AND 72
        FOR XML PATH('')
        )

FROM C_CONTACT_PERSONS R
WHERE R.MANAGEMENT <> 'NULL'

感谢您的任何意见 :)!

【问题讨论】:

  • 你的 dbms 是什么?
  • 这是什么数据库?是mysqlpostgresqlsql-serveroracle,还是其他产品?根据 RDBMS,这只需要将最后一列包装在 group_concat()list_agg() 类型函数中,并将每一列放在您的 GROUP BY 子句中。
  • 你真的有字符串'NULL'作为值吗?
  • 大多数数据库系统都有某种形式的列表聚合器。例如,您可以在 Oracle 中使用 listagg 将未分组的值聚合到单个列表字段中。

标签: php sql database html-table


【解决方案1】:

你可以像这样完全用 MySQL 做到这一点:

CREATE TABLE group_test (Name VARCHAR(255), Management VARCHAR(255), PermType VARCHAR(255));

INSERT INTO group_test (Name, Management, PermType) VALUES
("John Doe","Orderperm","PC perm"),
("John Doe","Orderperm","Telephone perm"),
("John Doe","Orderperm","Permission Perm"),
("Ash Ketcu","SomeOrder","PC perm"),
("Ash Ketcu","SomeOrder","Telephone perm"),
("Ash Ketcu","SomeOrder","Permission Perm");

SELECT Name, Management, GROUP_CONCAT(PermType) FROM group_test GROUP BY Name, Management;

+-----------+------------+----------------------------------------+
| Name      | Management | GROUP_CONCAT(PermType)                 |
+-----------+------------+----------------------------------------+
| Ash Ketcu | SomeOrder  | PC perm,Telephone perm,Permission Perm |
| John Doe  | Orderperm  | PC perm,Telephone perm,Permission Perm |
+-----------+------------+----------------------------------------+
2 rows in set (0,00 sec)

【讨论】:

  • 好吧,由于数据经常更改,我将不得不进行某种程序,有时一周或其他时间复制数据?但是,是的,我实际上可以尝试。
  • @JelloElks 答案的重点是 GROUP_CONCAT 函数。我在 cmets 中提到了 LISTAGG for Oracle。您正在要求一个聚合或连接多个值的函数。在 MSSQL 中,它是 STRING_AGG。
  • 抱歉错过了......好吧,自从它的 mssql 2008 以来,没有像 GROUP_CONCAT 和 STRING_AGG 这样的函数。我猜想实现类似功能的唯一方法是使用“STUFF”和“FOR XML PATH”。
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 2016-11-03
  • 2017-11-07
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多