【问题标题】:Updating query joining three tables to find specific records, need to update it to include all records from one table更新连接三张表的查询以查找特定记录,需要更新它以包含一张表中的所有记录
【发布时间】:2022-07-06 22:25:36
【问题描述】:

旧问题已关闭,并要求提供更多信息,因此我在此处添加了一些输入/输出屏幕截图。

从概念上讲,这似乎是一件简单的事情,但我已经尝试更新查询并且没有运气,所以也许有人可以看到我没有看到的东西。在这段摘录中,为了简洁起见,我更改了表名/别名并删除了几列,但我有以下查询:

SELECT t1.name, 
       t1.status, 
       t1.pid, 
       TIME(date_time) AS time, 
       t2.channel_name, 
       chattime, 
       email_sent, 
       sms_sent, 
       SUM(CASE WHEN notes = 'email' 
                THEN 1 
                ELSE 0 END) AS email 
FROM       table1 t1 
RIGHT JOIN table3 t3 
        ON t1.pid = t3.pid 
LEFT JOIN table2 t2 
       ON t2.channel_name = t3.channel_name 
GROUP BY t3.channel_name, 
         t1.pid, 
         date 
ORDER BY t3.id DESC;

基本上我正在做的是从 table3 中提取所有记录,如果 table2 中有相应的记录,则来自 t2 的“chattime”列也会插入到该记录中。表 1 包含与这些条目相关的一些其他信息。

我现在需要做的是更改查询,这样我仍然可以获取所有这些记录,但也可以从 table2 获取每条记录,无论 table3 中是否有匹配的 channel_name 可以加入条目。我不想要重复的条目,所以我的结果集基本上应该是我目前拥有的所有内容,以及尚未与 table3 中的条目关联的所有 table2 记录。

我尝试更新连接并尝试添加 table2.* 选择器,但我还没有找到任何可以解决问题的方法。如果对问题有任何不清楚的地方,请随时告诉我。

编辑

根据要求,我将添加更多有关输入和输出的信息。此查询用于将信息输入到 PHP 页面,输出如下:

以下是所涉及的三个表中的每一个表中的一些记录。我已经从这个截图和上面的截图中省略了名字。上为table1,中为table2,下为table3。

以下是输出页面上的列如何根据来自何处的内容进行布局:

客户端:table1.name PID:table1.pid 日期:table3.date_time 练习电子邮件、号码、区域,让我们打电话给你,表格发送:t3.inquiry_notes(数据库记录每个按钮的点击,查询说明表明它是什么类型的点击,因此我必须按 table3.channel_name 分组才能获取所有内容在输出的一条记录中) 聊天:table2.chattime 发送的电子邮件:table2.email_sent 短信发送:table2.sms_sent

【问题讨论】:

  • mysql 不支持全外连接,需要自己模拟。如果您寻找它,您会找到多种解决方案
  • 我看到您对旧版本的评论并尝试使用联合但无法使其正常工作。我必须添加一些空列以避免“列数不等”错误,但这会导致输出中的列丢失。我找不到保留正确输出格式的解决方案。

标签: mysql sql database


【解决方案1】:

当表 3 和表 3 没有重复列时,这将为您提供一个可以工作的版本。

SELECT * 是一个不好的选择,但是您的图像很难阅读。

除了阅读以供将来参考Why should I not upload images of code/data/errors when asking a question?

SELECT 
    t1.name,
    t1.status,
    t1.pid,
    TIME(date_time) AS time,
    t2.channel_name,
    chattime,
    email_sent,
    sms_sent,
    SUM(CASE
        WHEN notes = 'email' THEN 1
        ELSE 0
    END) AS email
FROM
    table1 t1
        RIGHT JOIN
    (SELECT 
        *
    FROM
        table3 t3
    LEFT JOIN table2 t2 ON t2.channel_name = t3.channel_name UNION SELECT 
        *
    FROM
        table3 t3
    RIGHT JOIN table2 t2 ON t2.channel_name = t3.channel_name) t23 ON t1.pid = t23.pid
GROUP BY t3.channel_name , t1.pid , date
ORDER BY t3.id DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多