我正在开发一个字典数据库,其中有4个表格,如
words
wordid | lemma
senses
wordid | synsetid
synsets
synsetid | definition
samples
synsetid | sample
所以我使用下面的查询来获取所有感知定义和样本
if(isset($searchterm)){
echo "<b>".$searchterm."</b><hr>";
// QUERY TO FIND SENSES
$senses_query="SELECT
words.lemma,words.wordid,
senses.wordid,senses.synsetid,
synsets.synsetid, synsets.definition,
samples.synsetid, samples.sample
FROM
words
LEFT JOIN
senses ON words.wordid=senses.wordid
LEFT JOIN
synsets ON senses.synsetid=synsets.synsetid
LEFT JOIN
samples ON senses.synsetid=samples.synsetid
WHERE
words.lemma REGEXP '^$searchterm$'";
$senses_query_result = mysql_query($senses_query) OR die("sense alamadım.<br>".mysql_error());
$num=mysql_num_rows($senses_query_result);
while($sensesFound = mysql_fetch_array($senses_query_result )){
echo " " . $sensesFound['lemma'] . "";
echo " " . $sensesFound['definition'] . "";
echo " " . $sensesFound['sample'] . "";
echo "<br>";
}
}
问题是:如果定义中有多个样本,则会像这样重复。
definition 1 sample 1
definition 1 sample 2
definition 2 sample 1
definition 2 sample 2
definition 2 sample 3
e.t.c
我喜欢像
这样的行definition 1 sample 1 sample 2
definition 2 sample 1 sample 2 sample 2
我在select上尝试了group_concat,但它将所有定义的所有样本汇总为单个。
是否可以使用mysql查询或者我应该使用php来处理这种工作。
提前致谢
答案 0 :(得分:1)
你可以使用GROUP_CONCAT,然后在php中使用列上的explode来分割各个样本。
此外,使用GROUP_CONCAT时,请确保使用示例文本中未使用的分隔符。
答案 1 :(得分:0)
不,您无法从单个查询中获得所需的方式,您必须使用GROUP_CONCAT将所有行(在连接查询中重复)作为单行获取。
使用GROUP_CONCAT
分隔的,
和@Dan说的一样,你可以explode (",", $result)
将其添加到数组中。
例如:
SELECT GROUP_CONCAT(samples.sample SEPERATOR ',' ) .....
上述查询将给出类似
的结果definition 1 sample-1,sample-2
definition 2 sample-1,sample-2,sample-3
.....
答案 2 :(得分:0)
您希望所有样本(在一行中)每个定义。
因此,请使用GROUP_CONCAT(samples.sample)
和GROUP BY senses.wordid, senses.synsetid
:
(我猜senses.wordid, senses.synsetid
是表senses
)
$senses_query="
SELECT
words.lemma, words.wordid,
senses.wordid, senses.synsetid,
synsets.synsetid, synsets.definition,
COUNT(samples.synsetid) AS numberOfSamples
GROUP_CONCAT(samples.sample SEPARATOR ', ') AS samples
FROM
words
LEFT JOIN
senses ON words.wordid=senses.wordid
LEFT JOIN
synsets ON senses.synsetid=synsets.synsetid
LEFT JOIN
samples ON senses.synsetid=samples.synsetid
WHERE
words.lemma REGEXP '^$searchterm$'
GROUP BY senses.wordid, senses.synsetid
";