首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MySQL执行复杂的多表搜索查询

使用MySQL执行复杂的多表搜索查询
EN

Stack Overflow用户
提问于 2014-03-28 06:50:10
回答 1查看 327关注 0票数 0

我正在做一个个人项目--只是为了好玩和学习--一本PHP和MySQL字典。然而,当我试图更精确地了解MySQL如何检索字典条目时,我遇到了一个问题。

我的查询的目的是在“条目”表中搜索所提供的单词作为“单词”(下面将进一步描述),如果找到结果,则列出“alternative”中的每个“alternative”。

但是,如果没有找到结果,则查询将搜索“alternative”,搜索所提供的单词作为“alternative”,然后从“entries”表返回具有相同“word”的相应结果。

我用下面这段草率的代码实现了这一点:

代码语言:javascript
复制
SELECT alternatives.word, alternatives.alternative, entries.added
  FROM alternatives
 INNER JOIN entries
    ON entries.word = alternatives.word
 WHERE entries.word = (SELECT word
                         FROM alternatives
                        WHERE alternative = "randomword"
                           OR word = "randomword" LIMIT 1)

不幸的是,这段代码没有考虑到其中的一个关键问题,那就是一个单词可以出现在“alternatives”中,但在“entries”中仍然有一个条目。(例如,'entries‘可能包含'query’和'query‘,'query’将看到‘query’作为替代,而‘query’将看到‘query’作为替代。)

“alternatives”表:

代码语言:javascript
复制
id | word [the word the alternative word is based on] | alternative [alternative word] | type [verb/noun/adjective etc...]

“条目”表:

代码语言:javascript
复制
id | word [the word] | date [timestamp of entry, must be returned]

这个问题有没有简单的解决方案?我现在完全卡住了。

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 07:20:32

我并不是100%了解你想要的东西,但是如果我理解正确的话,如果这段代码像我想的那样工作,那么它就可以工作。

据我所知,您想要在条目中查找单词,如果它存在,您希望返回它及其创建日期,并且在同一结果集中,您还希望返回每个单词及其日期,该日期显示为该单词的替代。如果没有找到,那么您希望从alternative表中返回搜索到的单词作为其替换的每个其他单词及其时间戳

代码语言:javascript
复制
IF (SELECT 1 = 1 FROM entries WHERE word = 'wordtosearch') THEN
BEGIN
    SELECT a.alternative, e.date 
    FROM alternatives a 
        INNER JOIN entries e ON a.alternative = e.word 
    WHERE a.word = 'wordtosearch'
    UNION
    SELECT word, date
    FROM entries
    WHERE word = 'wordtosearch';
END;
ELSE
BEGIN
    SELECT e.word, e.date 
    FROM alternatives a 
        INNER JOIN entries e ON a.word = e.word 
    WHERE a.alternative = 'wordtosearch';
END;
END IF;

这里要注意的一件事是,您需要基于记录的存在而完全不同的逻辑,这可能是使用joins实现的,但我认为最简单和最具可读性的解决方案是将两个操作完全分开。同样重要的是,两个结果集返回相同的列,否则您可能最终得到一个未知的结果集定义(即未知的列数),这很难正确处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22700867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档