使用MySQL和PHP在多个表中搜索

时间:2017-12-26 18:36:18

标签: php html mysql sql forms

我正在使用PHP和MySQL构建在线词汇表。 搜索页面包含两个下拉列表和一个用户输入所需术语的搜索字段。

我创建了八个表:

  • 四种语言及其变体(例如美国和英国的英语)
  • 四种语言的定义(英语定义,法语定义等)。

我被困在用户输入术语以获得所需翻译和相应定义的位置。 我如何构建与目标语言匹配的SQL查询,并根据下拉列表中的选择提供定义? 这是我到目前为止编写的代码。

HTML表单 - 查询文件



["20", "25"]




PHP - 检索文件

json_decode()

SQL 定义文件

$val = json_decode("$result") or $val = json_decode('["20", "25"]')

2 个答案:

答案 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列排序的正确翻译。 我希望这会有所帮助。