mysql - 将用户信息与消息表连接起来

标签 mysql sql join create-table

我基本上试图将用户信息与我的消息表连接起来。我基本上想获取来自给定用户的已发送给他们或他们已发送的所有消息。我的消息表如下所示:

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";

问题是这些返回错误的来自用户。如果登录用户撰写了该消息,我想知道该消息发送给了谁;反之亦然,如果该消息发送给了给定用户,则该消息发送给了谁。

这可以在一个查询中完成吗?还是我必须对发送和接收的消息进行单独的查询?

最佳答案

我认为您可以明智地使用 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) ;

关于mysql - 将用户信息与消息表连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420629/

相关文章:

php - Chrome 中的 Mysql 查询问题

mysql - 如何使用 ipv6 从 wordpress 连接到 mysql

SQL 条件关系

php - 使用 PHP 解析时,WHERE NOT EXISTS 在 SQL 中出现语法错误

mysql - sql LIKE 不返回预期的行

MySQL在三张表上写连接

Mysql 慢查询 - 即使有所有索引

php - if 语句和 session

mysql - 哪个更快 : a lookup on a large denormalized table or a join between three smaller tables?

SQLite 接受 SQL 语法中不存在的连接类型