【问题标题】:MySQL 3 tables single query for DatatablesMySQL 3表单查询Datatables
【发布时间】:2013-08-28 21:38:09
【问题描述】:

我试图在一个查询中从 3 个表中获取数据。这些表用于存储和显示用户消息。每个用户都可以登录并请求他的所有收件箱消息。用户 id 可从 PHP 会话中获得,参数 type=1 在 php 请求中传递,这意味着显示收件箱的请求(type=2 将是信息消息等)。

名为 email 的第一个表有 idsubjectbodydate

名为 email_routing 的第二个表有 message_idsender_email_idreceiver_email_idbaskettypemessage_id 指的是 email 表中邮件的id

发件人和收件人 ID 是指来自名为 people_emails 的第三个表中的电子邮件 ID。它由id(发件人和收件人电子邮件ID 所指)、internal_user_id(PHP 会话可用)、emailpeople_id(每个人的通讯录中可能有几封电子邮件)组成我将人员和他们的电子邮件存储在单独的表中,但如果不是我们感兴趣的最后一列)。

所以我可以弄清楚我将如何按顺序进行查询,并且只针对一行结果:

首先我会根据他的用户 ID 从 PHP 会话中获取用户电子邮件 ID:

$X = SELECT `id` from `people_emails` WHERE `internal_user_id`=$_conf[user]->id;

$X 不是正确的编码,假设它是我最终会得到的变量。

然后我可以在 email_routing 表中查询所有发给该用户的消息:

$Y = SELECT `message_id`, `sender_email_id`, `receiver_email_id` FROM `email_routing` WHERE `receiver_email_id`=$X[id] and `type`=$_REQUEST[type];

有了 message_id 的列表,我现在可以在电子邮件表中查询消息内容:

$R = SELECT `subject`, `body`, `date` FROM `email` WHERE `id`=$Y[message_id];

好的,那么我需要从其从 email_routing 表中获得的 id 中“翻译”“发件人”地址,所以它是:

$Z_from = SELECT `email` FROM `people_emails` WHERE `id`=$X[sender_email_id];

我现在拥有一行的所有数据。然后我需要把所有东西放在一起,这将是

$Z_from + $R[subject] + $R[body] + $R[date]

我需要将它作为一个结果列表,然后将其传递给引导数据表插件以进行显示和搜索。我似乎无法弄清楚这一点。请帮忙。

【问题讨论】:

  • 您要查找的内容称为join

标签: php mysql sql database-table


【解决方案1】:

您的查询,重新格式化:

$X:  SELECT p.id
       FROM people_emails p 
      WHERE p.internal_user_id = $_conf[user]->id;

$Y:  SELECT r.message_id
          , r.sender_email_id
          , r.receiver_email_id
       FROM email_routing r 
      WHERE r.receiver_email_id = $X[id] 
        AND r.type = $_REQUEST[type];

$R:  SELECT e.subject
          , e.body
          , e.date
       FROM email e
      WHERE e.id = $Y[message_id];

$F:  SELECT s.email
       FROM people_emails s 
      WHERE s.id = $Y[sender_email_id]

要返回这些列:

$F + $R[subject] + $R[body] + $R[date]

查询可以这样组合:

 SELECT s.email AS sender_email
      , e.subject
      , e.body
      , e.date
   FROM people_emails p 
   JOIN email_routing r 
     ON r.receiver_email_id = p.id
    AND r.type = $_REQUEST[type]
   JOIN email e
     ON e.id = r.message_id
   JOIN people_emails s
 ON s.id = r.sender_email_id
  WHERE p.internal_user_id = $_conf[user]->id;

跟进

要从people 表中添加发件人full_name,我们可以向该表添加一个连接,并将该列添加到SELECT 列表中:

$N = SELECT n.full_name
       FROM people n 
      WHERE n.id = (SELECT s.people_id
                      FROM people_emails s 
                     WHERE s.email = :sender_email
                   )

我们已经从上面的查询中得到了:sender_email,它是从 SELECT 列表中的s.email 返回的值,所以我们可以在people 表中添加一个连接:

 SELECT s.email     AS sender_email
      , n.full_name AS sender_full_name
      , e.subject
      , e.body
      , e.date
   FROM people_emails p 
   JOIN email_routing r
     ON r.receiver_email_id = p.id
    AND r.type = $_REQUEST[type]
   JOIN email e
     ON e.id = r.message_id
   JOIN people_emails s
 ON s.id = r.sender_email_id
   JOIN people n
     ON n.id = s.people_id
  WHERE p.internal_user_id = $_conf[user]->id;

(我无法真正对此进行测试,因为我没有您的表定义或示例数据。)

【讨论】:

  • 太棒了!谢谢,这完全符合我的需要。当时我很难将它传递给数据表,但我找到了一种方法来做到这一点。最后我突然意识到我还需要一列,即存储在 people 表中的发件人的full_name,可以通过 SELECT full_name FROM people WHERE id=(SELECT people_id FROM @987654333 找到@WHEERE email=sender_email);我试图在您的示例中的 SLECT 之后添加 f.full_name,然后添加“JOIN people f ON f.id = s.people_id”,但我得到的是我自己的全名(接收者姓名),没有发件人姓名。
  • 太棒了!这立即奏效了。谢谢你。我想我必须学习这个 JOIN,因为我不知道你是怎么做的,但它得到了需要的结果。
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多