【问题标题】:Need help again about joining tables再次需要关于加入表格的帮助
【发布时间】:2013-07-21 17:38:36
【问题描述】:

我问了一个关于 MySQL 请求的问题,我的帖子可以在这里找到:Need help about joining tables

现在我有另一个与此相关的问题,所以在我的页面上,我列出了来自数据库的票,我的请求是:

"SELECT
    glpi_tickets.id,
    glpi_tickets.name,
    GROUP_CONCAT(
            CASE WHEN glpi_tickets_users.type = 1 THEN 
            CONCAT(glpi_users.firstname, ' ', glpi_users.realname)
        END) AS creator,
    GROUP_CONCAT(
        CASE WHEN glpi_tickets_users.type = 1 THEN 
            CONCAT(glpi_tickets_users.users_id)
        END) AS creator_id,
    GROUP_CONCAT(
        CASE WHEN glpi_tickets_users.type = 2 THEN 
            CONCAT(glpi_users.firstname, ' ', glpi_users.realname)
        END) AS users,
    GROUP_CONCAT(
        CASE WHEN glpi_tickets_users.type = 2 THEN 
            CONCAT(glpi_tickets_users.users_id)
        END) AS users_id,
    glpi_tickets.date,
    glpi_tickets.priority,
    glpi_tickets.date_mod,
    glpi_itilcategories.completename,
    glpi_tickets.status,
    glpi_tickets.users_id_lastupdater,
    GROUP_CONCAT(
        CASE WHEN glpi_tickets.users_id_lastupdater = glpi_users.id THEN
            CONCAT(glpi_users.firstname, ' ', glpi_users.realname) 
        END SEPARATOR '<br>') AS last_updater,
    glpi_tickets.content
    FROM
        glpi_tickets
    JOIN glpi_tickets_users ON glpi_tickets_users.tickets_id = glpi_tickets.id
    JOIN glpi_users ON glpi_users.id = glpi_tickets_users.users_id
    JOIN glpi_itilcategories ON glpi_itilcategories.id = glpi_tickets.itilcategories_id
    GROUP BY
        glpi_tickets.id"

结果如下:

[ID][Title][creator][date created][priority][category][status][date modified][assigned to][last update by]
[125][helpdesk test][admin][29-01-2013 21:09][low][messaging][new][30-01-2013 17:52][Tony][admin]

对于每张工单,creator - creator_id 和 users - users_id 可以包含多个 ID 和名称。

现在我想在另一个页面中显示用户信息,我使用了相同的请求,但 WHERE glpi_users.id = ?users.php?id=x 获取 id

除了创建者和用户之外,一切都很好,因为WHERE glpi_users.id = x 只选择一个人。

我想要一种显示方式,就像之前的请求一样,提前致谢

编辑:尝试了 GolezTrols 解决方案,但它不起作用,这是我的查询:

"SELECT
                        glpi_tickets.id,
                        glpi_tickets.name,
                        GROUP_CONCAT(
                            CASE WHEN glpi_tickets_users.type = 1 THEN 
                                CONCAT(glpi_users.firstname, ' ', glpi_users.realname)
                            END) AS creator,
                        GROUP_CONCAT(
                            CASE WHEN glpi_tickets_users.type = 1 THEN 
                                CONCAT(glpi_tickets_users.users_id)
                            END) AS creator_id,
                        GROUP_CONCAT(
                            CASE WHEN glpi_tickets_users.type = 2 THEN 
                                CONCAT(glpi_users.firstname, ' ', glpi_users.realname)
                            END) AS users,
                        GROUP_CONCAT(
                            CASE WHEN glpi_tickets_users.type = 2 THEN 
                                CONCAT(glpi_tickets_users.users_id)
                            END) AS users_id,
                        glpi_tickets.date,
                        glpi_tickets.priority,
                        glpi_tickets.date_mod,
                        glpi_itilcategories.completename,
                        glpi_tickets.status,
                        glpi_tickets.users_id_lastupdater,
                        GROUP_CONCAT(
                            CASE WHEN glpi_tickets.users_id_lastupdater = glpi_users.id THEN
                                CONCAT(glpi_users.firstname, ' ', glpi_users.realname) 
                            END SEPARATOR '<br>') AS last_updater,
                        glpi_tickets.content
                    FROM
                        glpi_tickets
                        JOIN glpi_tickets_users ON glpi_tickets_users.tickets_id = glpi_tickets.id
                        JOIN glpi_users ON glpi_users.id = glpi_tickets_users.users_id
                        JOIN glpi_itilcategories ON glpi_itilcategories.id = glpi_tickets.itilcategories_id
                    WHERE
                       exists (
                            SELECT 
                              'x' 
                            FROM
                              glpi_tickets_users
                            WHERE
                            glpi_tickets_users.tickets_id = glpi_tickets.id AND
                            glpi_tickets_users.id = ? AND
                            glpi_tickets_users.type = 1)
                    GROUP BY
                        glpi_tickets.id"

几乎所有时间它根本没有显示票证,有时它显示票证但与用户无关,例如,如果我尝试users.php?id=1536,它将显示由用户 870 创建的票证号 789负责这张票的用户 1180 和 1632...

【问题讨论】:

  • 查询看起来很复杂。数据库表的结构会很有帮助。
  • 所以忽略WHERE users.id = x 条件并使用WHERE glpi_users.id = 简单,那么问题出在哪里

标签: php mysql concat group-concat


【解决方案1】:

您应该检查用户是否与问题相关,而不是过滤确切的用户 ID,如下所示:

select
  t.title,
  group_concat(
    case when tu.type = 1 then 
      concat(u.firstname, ' ', u.lastname)
    end) as creator,
  t.priority,
  t.date,
  group_concat(
    case when tu.type = 2 then 
      concat(u.firstname, ' ', u.lastname)
    end SEPARATOR ' - ') as users
from
  tickets t
  inner join tickets_users tu on tu.ticketid = t.id
  inner join users u on u.id = tu.userid
where 
  exists (
    select 
      'x' 
    from 
      tickets_users tu2 
    where 
      tu2.ticketid = t.id and 
      tu2.userid = <youruserid> and 
      tu2.type = 1)
group by
  t.id;

对于&lt;youruserid&gt;,您可以填写您想要的用户ID。此查询将返回该用户报告的所有问题(类型 = 1)。但是对于所有这些问题,仍然会返回所有相关用户,因此您的查询结果仍然是完整的。

【讨论】:

  • 非常感谢,我会试试看,但是 select 'x' 是什么,我应该将创建票证的用户放在“yourusersid”中吗?
  • 'x' 只是一个常数值。它也可以是1foo,或事件tu2.userid,但exists 只检查子查询是否返回任何行,因此该值并不重要。只是 MySQL 需要一个 select 来返回至少 1 个值,所以这就是我使用这个 dummy 'x' 的原因。 &lt;youruserid&gt; 确实是您要搜索的用户。就像你问题中的x,这让我明白我为什么让你感到困惑。 :)
  • 如果您不想要用户创建的工单,而是分配给用户的工单,您可以将类型更改为2。如果没关系,您可以从查询中删除 type 条件,以获取用户以任何方式关联的所有票证。
  • 我编辑了我的第一篇文章以向您展示我的查询,我也尝试使用您的未修改的,它是一样的,我不明白出了什么问题,为什么它显示没有票或不相关的票给用户:(
  • 哦!我想我找到了解决方案,我在您的子查询中添加了JOIN glpi_users ON glpi_users.id = glpi_tickets_users.users_id 并用glpi_users.id = ? 替换了glpi_tickets_users.id,看来它正在工作!非常感谢您的帮助和时间
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2016-04-04
  • 2017-08-05
  • 2023-04-06
相关资源
最近更新 更多