0

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

第一个名为email的表有id, subject,bodydate

第二个名为email_routing的表有message_id, sender_email_id, receiver_email_id, basket, type. email表中消息的message_id引用。id

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

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

拳头我会根据他的 user_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]

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

4

1 回答 1

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;

跟进

要从表中添加发件人,我们可以full_name向该people表添加一个联接,并将该列添加到 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从上面的查询中得到,它是从s.emailSELECT 列表中返回的值,所以我们可以向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;

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

于 2013-08-28T21:52:26.753 回答