结合两个表的MySQL查询问题

时间:2014-03-21 12:40:33

标签: mysql sql levenshtein-distance

我有两张桌子:

`search_chat` (
  `pubchatid` varchar(255) NOT NULL,
  `profile` varchar(255) DEFAULT NULL,
  `prefs` varchar(255) DEFAULT NULL,
  `init` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `session` varchar(255) DEFAULT NULL,
  `device` varchar(255) DEFAULT NULL,
  `uid` int(10) DEFAULT NULL,
  PRIMARY KEY (`pubchatid`)

`chats` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `chatlog` varchar(255) DEFAULT NULL,
  `block` varchar(2) DEFAULT '',
  `whenadded` datetime DEFAULT NULL,
  `pubchatid1` varchar(255) DEFAULT NULL,
  `pubchatid2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)

所以基本上人们通过基于prefrences的搜索系统互相聊天。它们越远,它就越糟糕。所以我的查询很简单:

SELECT * 
  FROM search_chat 
 WHERE levenshtein(profile, "[user_prefs]") < 20
       AND pubchatid <> "[user_pubchatid]"
ORDER BY 
       levenshtein(profile, "[user_prefs]") 
 LIMIT 1

这本身就是一个糟糕的查询,但它完成了这项工作(“[]”之间的所有内容都是我输入的变量,只是为了说清楚。)

正如您所看到的,此查询仅在两个人的首选项(首选项)及其如何(个人资料)之间进行选择。到目前为止一切都很好。

我一直在喋喋不休地讨论一下这个查询是否也检查过他们之前的聊天记录。这就是“聊天”的用武之地。我无法通过查询来检查合适的用户,看看他们是否有开放式聊天。

在聊天中,“search_chat.pubchatid”可以是“chats.pubchatid1”或“chats.pubchatid2”

所以不知怎的,我必须让这两个工作,让聊天排除search_chat中的选项。

1 个答案:

答案 0 :(得分:1)

你想要这样的东西:

-- ... ( start of query as per your question )
and not exists ( 
  select * 
  from chats
  where ( ( chats.pubchatid1 = search_chat.pubchatid ) 
       or ( chats.pubchatid2 = search_chat.pubchatid ) ) 
  and -- ... add any restriction on how recent the chat was 
)