我正在做一个个人项目--只是为了好玩和学习--一本PHP和MySQL字典。然而,当我试图更精确地了解MySQL如何检索字典条目时,我遇到了一个问题。
我的查询的目的是在“条目”表中搜索所提供的单词作为“单词”(下面将进一步描述),如果找到结果,则列出“alternative”中的每个“alternative”。
但是,如果没有找到结果,则查询将搜索“alternative”,搜索所提供的单词作为“alternative”,然后从“entries”表返回具有相同“word”的相应结果。
我用下面这段草率的代码实现了这一点:
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”表:
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]这个问题有没有简单的解决方案?我现在完全卡住了。
发布于 2014-03-28 07:20:32
我并不是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;这里要注意的一件事是,您需要基于记录的存在而完全不同的逻辑,这可能是使用joins实现的,但我认为最简单和最具可读性的解决方案是将两个操作完全分开。同样重要的是,两个结果集返回相同的列,否则您可能最终得到一个未知的结果集定义(即未知的列数),这很难正确处理。
https://stackoverflow.com/questions/22700867
复制相似问题