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

时间:2014-03-27 22:50:10

标签: php mysql sql database relational-database

我正在制作一个个人项目 - 只是为了娱乐和学习目的 - 一个PHP和MySQL词典。但是,当我试图更准确地了解MySQL如何检索字典条目时,我遇到了一个问题。

我的查询意图是在“条目”表中搜索提供的单词作为“单词”(进一步描述),如果找到结果,则从“替代”列出每个“替代”它

但是,如果没有找到结果,则查询将搜索“alternative”,搜索提供的单词作为“替代”,然后从“条目”表中返回相应的“单词”相应的结果

我用这个草率的代码实现了这个目标:

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)

不幸的是,这段代码没有考虑到这个问题的一个关键问题,即一个词可以在'alternative'中,但在'entries'中仍然有一个条目。 (例如,'条目'可能包含'查询'和'查询','查询'会看到'查询'作为替代,而'查询'会看到'查询'作为替代。)

'alternative'表:

id | word [the word the alternative word is based on] | alternative [alternative word] | type [verb/noun/adjective etc...]

'条目'表:

id | word [the word] | date [timestamp of entry, must be returned]

这个问题有一个简单的解决方案吗?我现在完全被困住了。

1 个答案:

答案 0 :(得分:0)

我不是100%正是你所追求的,但如果我理解正确,如果这个代码做了我认为它做的那么它就可以工作。

根据我的理解,您希望在条目中查找单词,如果它存在,您希望将其与创建日期一起返回,并且在同一结果集中,您还希望返回每个单词及其日期作为替代对于那个词。 如果找不到,那么你想要从alternative表中返回每个其他单词,搜索到的单词是替代单词及其时间戳

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;

要注意的一点是,你需要基于记录存在的完全不同的逻辑,这可能是连接的可能,但我认为最简单和最可读的解决方案将完全拆分两个操作。 同样重要的是两个结果集都返回相同的列,否则您最终可能会得到一个难以正确处理的未知结果集定义(即未知的列数)。