AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 105283
Accepted
Arpan Das
Arpan Das
Asked: 2015-06-27 10:50:16 +0800 CST2015-06-27 10:50:16 +0800 CST 2015-06-27 10:50:16 +0800 CST

mysql group_concat 的问题,复杂的查询,没有得到所需的结果

  • 772

我有 5 张桌子

  • 大学
  • 贸易
  • 区
  • 接触
  • 录取

他们的关系是这样的

表关系

我的联系表有问题。在这个表中,cid 和 location 是主键。每个cid(即大学ID)只能有两个位置的校园和办公室。表摄入量连接大学和贸易表。通过下面的查询,我得到每个地址两次的结果。这是我的查询:

SELECT cname, ctype, tname, seats, hostel, new, dname, address, ph_no, email, website FROM college, trade, district, intake, contact WHERE intake.cid = college.cid and intake.tid = trade.tid and college.did = district.did and contact.cid = college.cid ORDER BY cname ASC;

我目前的结果: 我目前的结果

我想要的结果: 要求的结果

我知道这可以通过 grop_concat 和 concat 函数来实现,但我不知道在这种情况下如何使用这些函数。有人请帮助我构建查询以实现此结果。

谢谢你。

mysql group-concatenation
  • 3 3 个回答
  • 5163 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2015-06-27T11:13:30+08:002015-06-27T11:13:30+08:00

    它会是这样的:

    SELECT cname, ctype, tname, seats, hostel, dname,
    GROUP_CONCAT(addr SEPARATOR '\n') addresses
    FROM
    (
        SELECT cname, ctype, tname, seats, hostel, dname,
        CONCAT('Address: ',address,',Phone:',ph_no,',Email:',email,',Website:',website) addr
        FROM college, trade, district, intake, contact
        WHERE intake.cid = college.cid
        and intake.tid = trade.tid
        and college.did = district.did
        and contact.cid = college.cid
        AND cname LIKE '%{$cname}%'
        AND tname LIKE '%{$tname}%' {$ctype}
        AND dname LIKE '%{$dname}%' {$hostel}
        ORDER BY cname ASC
    ) A GROUP BY cname, ctype, tname, seats, hostel, dname;
    

    由于group_concat_max_len的默认值为 1024,因此您可能需要再做两件事来容纳超过GROUP_CONCAT1024 的结果

    首先,登录 MySQL 并运行

    mysql> SET GLOBAL group_concat_max_len = 1024 * 1024;
    

    然后,将其添加到组标题my.cnf下[mysqld]

    [mysqld]
    group_concat_max_len=1M
    

    试试看 !!!

    • 0
  2. oNare
    2015-06-27T11:15:09+08:002015-06-27T11:15:09+08:00

    这应该适合你:

    SELECT 
        cname, 
        ctype, 
        tname, 
        seats, 
        hostel, 
        dname, 
        GROUP_CONCAT(address SEPARATOR '\n') AS address, 
        ph_no, 
        email, 
        website
    FROM college, trade, district, intake, contact
    WHERE intake.cid = college.cid and intake.tid = trade.tid 
        and college.did = district.did and contact.cid = college.cid
    GROUP BY cid
    ORDER BY cname ASC;
    

    我补充说GROUP_CONCAT(address SEPARATOR '\n'),这使得在地址之间跳过一行并将GROUP BY cid其分组cid。

    • 0
  3. Arpan Das
    2016-03-04T04:26:50+08:002016-03-04T04:26:50+08:00

    解决了,查询是:

        $sql = "SELECT cname, ctype, tname, seats, dname, hostel,
                GROUP_CONCAT(addr SEPARATOR '<hr />') addresses
                FROM
                (
                    SELECT cname, ctype, tname, seats, dname, hostel,
                    CONCAT('<b>Address:</b> ', IFNULL(address, 'N/A'),
                            ',<br /><b>Phone:</b> ', IFNULL(ph_no, 'N/A'),
                            ',<br /><b>Email:</b> ', IFNULL(email, 'N/A'),
                            ',<br /><b>Website:</b> ', IFNULL(website, 'N/A')
                        ) addr
                    FROM college, trade, district, intake, contact
                    WHERE intake.cid = college.cid
                        AND intake.tid = trade.tid
                        AND college.did = district.did
                        AND contact.cid = college.cid
                        AND cname LIKE '%{$name}%' 
                        AND tname LIKE '%{$trade}%' 
                        {$type} 
                        AND dname LIKE '%{$district}%' 
                        {$hostel}
                    ORDER BY cname ASC
                ) A GROUP BY cname, ctype, tname, seats, dname, hostel";
    

    不添加 IFNULL 会产生问题。最初由 RolandoMySQLDBA 回答。谢谢。

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve