我正在制作一个个人项目 - 只是为了娱乐和学习目的 - 一个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]
这个问题有一个简单的解决方案吗?我现在完全被困住了。
答案 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;
要注意的一点是,你需要基于记录存在的完全不同的逻辑,这可能是连接的可能,但我认为最简单和最可读的解决方案将完全拆分两个操作。 同样重要的是两个结果集都返回相同的列,否则您最终可能会得到一个难以正确处理的未知结果集定义(即未知的列数)。