2014-01-29 53 views
0

我基本上是試圖加入用戶信息與我的郵件表。我基本上想要獲得來自給定用戶的所有已發送給他們或他們已發出的消息。我的郵件表看起來像這樣:加入用戶信息與郵件表

CREATE TABLE IF NOT EXISTS `messages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `toId` int(11) NOT NULL, 
    `fromId` int(11) NOT NULL, 
    `msg` text NOT NULL, 
    `createdOn` varchar(100) NOT NULL, 
    `status` enum('new','unread','read','archived','deleted') NOT NULL DEFAULT 'new', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=31; 

用戶表看起來像這樣:

CREATE TABLE `users` (
    `id` int(11) NOT NULL auto_increment, 
    `pid` int(11) NOT NULL, 
    `gender` enum('male','female') NOT NULL, 
    `fname` varchar(25) NOT NULL, 
    `lname` varchar(25) NOT NULL, 
    `address` varchar(50) NOT NULL, 
    `city` varchar(25) NOT NULL, 
    `state` varchar(2) NOT NULL, 
    `zip` int(5) NOT NULL, 
    `email` varchar(100) NOT NULL, 
    `username` varchar(50) NOT NULL, 
    `about` text NOT NULL, 
    `createdOn` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=61 ; 

我已經試過以下查詢:

$messages = "SELECT * FROM (SELECT messages.*, users.pid, users.username FROM messages, users WHERE messages.fromId = users.id AND messages.toId = '". $_COOKIE['id'] ."' ORDER BY messages.createdOn DESC) as messages GROUP BY fromId"; 

$messages = "SELECT messages.toId, messages.fromId, messages.msg, messages.createdOn, users.pid, users.username FROM messages, users WHERE (messages.toId = ". $_COOKIE['id'] ." OR messages.fromId = ". $_COOKIE['id'] .") AND messages.fromId = users.id GROUP BY messages.fromId ORDER BY messages.createdOn DESC"; 

$messages = "SELECT messages.* FROM messages JOIN (SELECT messages.fromId, max(messages.createdOn) as date_creation FROM messages WHERE messages.toId = 1 GROUP BY messages.fromId) users ON messages.fromId = users.id"; 

的問題是,這些返回錯誤from用戶。我想知道,如果記錄的用戶編寫了該消息,則發送該消息的是誰,反之亦然,如果該消息是發送給給定用戶的,則該消息是誰。

這可能在一個查詢中完成,還是必須對發送和接收的消息進行單獨查詢?

回答

1

我認爲你可以使用明智的使用case語句來得到你想要的東西:

select id, (case when $_COOKIE['id'] = fromid then toId else FromId end) as OtherId, 
     (case when $_COOKIE['id'] = fromid then 'sent' else 'received' end) as which, 
     msg, createdOn, status 
from messages m 
where $_COOKIE['id'] in (fromId, toId) ; 
+0

+1對於一個巧妙的利用情況! – Durandal

+0

嘿謝謝!我喜歡這樣,這正是我所希望的,但我不知道寫出來的語法! –