MySQL按用户名和下表选择数据

MySQL按用户名和下表选择数据,mysql,join,Mysql,Join,我有三张桌子 提要-用户-跟踪 我试图显示一个提要,其中要么是USERNAME=$\u SESSION[USERNAME],要么是当前登录的用户正在跟踪下表中的某个人 SELECT feed.id, feed.username, feed.status, feed.timestamp, users.image FROM feed,users AND users.username = '$username' ORDER BY feed.id DESC 下面是我当前的查询,它仅根据用户名从提要

我有三张桌子

提要-用户-跟踪

我试图显示一个提要,其中要么是
USERNAME=$\u SESSION[USERNAME]
,要么是当前登录的用户正在跟踪下表中的某个人

SELECT feed.id, feed.username, feed.status, feed.timestamp, users.image 
FROM feed,users 
AND users.username = '$username'
ORDER BY feed.id DESC
下面是我当前的查询,它仅根据用户名从提要中选择所有内容,不包括下表

SELECT feed.id, feed.username, feed.status, feed.timestamp, users.image 
FROM feed,users 
AND users.username = '$username'
ORDER BY feed.id DESC
表格设计:

那么,如何使此查询包含下表中的任何人

TABLES:
--
-- Table structure for table `feed`
--

CREATE TABLE IF NOT EXISTS `feed` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `status` text NOT NULL,
  `ipaddress` varchar(100) NOT NULL,
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Table structure for table `following`
--

CREATE TABLE IF NOT EXISTS `following` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `following` varchar(100) NOT NULL,
  `ipaddress` varchar(100) NOT NULL,
  `timestamp` int(11) NOT NULL,
  `isfollowing` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `user_level` int(11) NOT NULL DEFAULT '0',
  `name` varchar(100) NOT NULL,
  `image` varchar(100) NOT NULL DEFAULT 'default.png',
  `profile_background` varchar(255) NOT NULL DEFAULT 'default_background.png',
  `description` varchar(255) NOT NULL,
  `went_to_school` varchar(100) NOT NULL,
  `worked_at` varchar(100) NOT NULL,
  `lives_in` varchar(100) NOT NULL,
  `from_originally` varchar(100) NOT NULL,
  `expires` datetime NOT NULL,
  `ipaddress` varchar(50) NOT NULL,
  `browser` varchar(100) NOT NULL DEFAULT 'n/a',
  `show_email` int(11) NOT NULL DEFAULT '1',
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;

这里的总体思路是在
下表中加入

 SELECT feeds.*
   FROM feeds
   LEFT JOIN following ON following.following=feeds.username
   WHERE feeds.username=? OR following.username=?
LEFT JOIN
是一种表示“如果存在匹配项,则将a与B组合,否则将B保留为所有空值”的方式。还有其他类型做不同的事情

请注意,使用用户名作为键非常笨拙。我强烈建议您尽快迁移到基于ID的系统


您还应该远离MyISAM表,它们不支持事务,也没有日志。一个简单的服务器崩溃可能会彻底破坏表,使其无法修复。InnoDB明显更健壮,应尽可能使用。在MySQL 5.7中,几乎没有理由使用MyISAM。

您应该绝对确保在查询中转义了
$username
之类的内容,否则您可能会陷入困境。还有,为什么在这里使用用户名作为密钥?如果您遵循正确的数据库规范化实践,它实际上应该基于更不可变的东西,比如ID。使用用户名会使您面临有人“继承”已删除的帐户中的数据的风险,如果他们选择相同的名称。我的特定系统不允许更改用户名,因此用户不容易继承。$username变量是php变量中的escape,因此我们在这方面也做得很好。坏习惯?对我只是习惯了这样做:(现在不允许,但你不能肯定将来不会发生。希望你能在它成为一个大问题之前解决它。另外,因为它们基于大小ID的索引通常更快、更具可伸缩性。顺便说一句,这里你需要的是一个
连接
来组合表。你能举个小例子吗通过上面的查询?我对加入表有点陌生。谢谢你。我还需要获取用户配置文件数据(存储在users表中)。这不考虑唯一的跟随(例如,如果username1跟随3个人,它将列出3个人*3)如果需要,您可以加入其中,但这会使您的查询速度越来越慢。为什么不在第二次查询中检索用户数据?我被告知一次查询总是更好。也许我错了:(不管用户_配置文件数据如何,如何从左连接中获得不同的行?一个查询可能更好,但您需要根据具体情况进行评估。如果您要提取大量用户数据,则第二个查询将每个用户发送一次数据,而不是每个帖子发送一次。这可能会大大减少数据。我的意思是:-其基于3个追随者,显示1个提要帖子3次