我正在使用PHP和MySQL构建在线词汇表。 搜索页面包含两个下拉列表和一个用户输入所需术语的搜索字段。
我创建了八个表:
我被困在用户输入术语以获得所需翻译和相应定义的位置。 我如何构建与目标语言匹配的SQL查询,并根据下拉列表中的选择提供定义? 这是我到目前为止编写的代码。
HTML表单 - 查询文件
["20", "25"]

PHP - 检索文件
json_decode()
SQL 定义文件
$val = json_decode("$result") or $val = json_decode('["20", "25"]')
答案 0 :(得分:0)
正如所建议的那样,规范化您的数据库模式以使用一个带有指示符的长表而不是具有不同名称的类似结构化表进行扩展。例如, Perfect 的以下翻译将需要与其他所有可能的配对交叉匹配:
TranslationTerms
TermID Langauge Variant Term
1 English US Perfect
2 French France Parfait
3 German Germany Perfekt
4 Spanish Spain Perfecto
5 Swahili Kenya Inafaa
6 Arabic Kuwait في احسن الاحوال
...
TranslationMatches
MatchID SourceTermID TargetTermID
1 2 1
2 3 1
3 4 1
4 5 1
5 6 1
6 1 2
7 3 2
8 4 2
9 5 2
10 6 2
11 1 3
12 2 3
13 4 3
14 5 3
15 6 3
16 1 4
17 2 4
18 3 4
19 5 4
20 6 4
21 1 5
22 2 5
23 3 5
24 4 5
25 6 5
26 1 6
27 2 6
28 3 6
29 4 6
30 5 6
然后在PHP中使用self-join条款表查询,它们都连接到匹配表
$source = addslashes($source);
$target = addslashes($target);
$search = addslashes($search);
// LIST OF ALL TARGET TERMS
$query = "SELECT trgt.Term
FROM TranslationMatches m
INNER JOIN TranslationTerms src
ON m.SourceTermID = src.TermID AND src.Language = ?
INNER JOIN TranslationTerms trgt
ON m.TargetTermID = trgt.TermID AND trgt.Language = ?
WHERE src.Term LIKE ?;"
$stmt = $conn->prepare($query);
$stmt->bind_param("sss", $source, $target, "%".$search."%")
$stmt->execute($query);
$stmt->store_result();
$num_results = $stmt->num_rows;
echo '<p>Number of entries found: '.$num_results.'</p>';
答案 1 :(得分:0)
除了Parfait答案,您可能还想添加额外的列&#34; match_percentage&#34;到TranslationMatches表,这样一个术语可以有多个匹配,每个匹配具有匹配的强度或百分比,因为语言中的单词很少有100%匹配并且具有依赖于上下文的翻译。这种方式对于每个术语,您向用户显示多个单词,这些单词可能是match_percentage列排序的正确翻译。 我希望这会有所帮助。