- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要一个显示多个关键字(复选框)的 php 页面,例如 Narberth、Pembrokeshire、Carmarthenshire 等地区以及其他地方。
到目前为止,我已经创建了一种方法来执行此操作并在表格中单独显示数据。我遇到的问题是首先显示具有与其关联的多个关键字的行。
因此,如果用户搜索“Narberth”和“Pembrokeshire”,结果将首先显示包含这两个关键字的所有文档,然后是仅包含“narberth”和“pembrokshire”后缀的所有文档。
我列出了我到目前为止所完成的代码:
<form method="post">
<table border="1px solid" width="60%">
<tr>
<td><input type="checkbox" name="keywords[]" value="1">Narberth </td>
<td><input type="checkbox" name="keywords[]" value="2">James Brothers </td>
<td><input type="checkbox" name="keywords[]" value="3">Mabinogion </td>
</tr>
<tr>
<td><input type="checkbox" name="keywords[]" value="4">Pembrokeshire </td>
<td><input type="checkbox" name="keywords[]" value="5">Pubs </td>
<td><input type="checkbox" name="keywords[]" value="6">Coastal Paths </td>
</tr>
</table>
<br>
<input type="submit" name = "submit">
<?php
if (isset($_POST['submit'])) {
foreach( $_REQUEST['keywords'] as $keywordID )
{
$result = mysql_query("SELECT * FROM tbl_index m
inner join tbl_filekeywords r on m.file_id = r.file_id
where r.keyword_id = '".$keywordID."'");
$keywordname = mysql_query ("SELECT keyword FROM tbl_keywords WHERE keyword_id = '".$keywordID."'");
$KeywordName = mysql_fetch_row($keywordname);
$KeywordName = $KeywordName[0];
echo "<table border='1' width='50%'>
<th colspan='2'>".$KeywordName."</th>
<tr>
<th>File ID</th>
<th>Filename</th>
</tr>";
while($row = mysql_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['file_id'] . "</td>";
echo "<td>" . $row['file'] . "</td>";
echo "</tr>";
}
echo "</table><br>";
mysql_free_result($result);
}
}?>
P.S 我开发了另一种替代方法,将所有文件集中到一个表中,这很好,但我仍然想阻止相同的文件针对每个关键字多次出现,并且宁愿优先处理具有多个关键字的文件并显示在顶部。
<?php
if(isset($_POST['keywords']) && !empty($_POST['keywords'])){
foreach($_POST['keywords'] as $key=>$value){
if($value==1) $keywords[] = "keyword_id='".mysql_escape_string($key)."'";
}
$keywords = implode(' OR ', $keywords);
}
$query = "SELECT * FROM tbl_index m inner join tbl_filekeywords r on m.file_id = r.file_id WHERE $keywords";
$result = mysql_query($query);
echo "<table border='1' width='50%'>
<tr>
<th>File ID</th>
<th>Filename</th>
<th>Keyword_ID</th>
</tr>";
while($row = mysql_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['file_id'] . "</td>";
echo "<td>" . $row['file'] . "</td>";
echo "<td>" . $row['keyword_id'] . "</td>";
echo "</tr>";
}
echo "</table><br>";
mysql_free_result($result);
?>
最后表格设置如下:
tbl_index : file_id, file
tbl_keywords : keyword_id, keyword
tbl_filekeywords : file_id, keyword_id
最佳答案
首先,欢迎来到 SO。回复后延迟是由于非综合问题。在接下来的问题中,请记住仅包含要提问的相关代码。
假设 tbl_index
和 tbl_filekeywords
表是 1:N 关系。
首先,在 php 中,您可以获得 $keywords
作为所选关键字的字符串列表示例:
$keywords = " 1, 5, 12, 24"
现在您可以用这种方式对 tbl_file 关键字进行排名。我们将排名 View
命名为:
select
r.file_id,
sum( case when r.keyword_id in ( $keywords ) then 1 else 0 end ) as rank
from
tbl_filekeywords r
group by
r.file_id
最后一步是加入 rank view
和 tbl_index:
select t.*
from
tbl_index t left outer join
( HERE PREVIUS QUERY ) r
on r.file_id = t.file_id
order by
coalesce( r.rank, 0 )
让我们知道这是否运行,它是适合您的解决方案。如果不是,请解释我们如何改进答案!
根据 OP 评论进行编辑
我没有你的数据库模式,但似乎 file_id
是 tbl_index
的 PK。如果是这种情况,则查询不会产生重复项。请注意,第一个查询 rank view
由于 group by 子句,每个 file_id
只有一行。因此,加入不会产生重复项。对我来说,最终的查询是:
select t.*
from
tbl_index t inner join <--No dups
(
select
r.file_id,
count(*) as rank
from
tbl_filekeywords r
where
r.keyword_id in ( $keywords )
group by
r.file_id <--No dups
) r2
on r2.file_id = t.file_id
order by
r2.rank
关于php - 创建搜索查询并根据选中的复选框显示结果(难点分组结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476220/
我是一名优秀的程序员,十分优秀!