mySQLi过滤数据库结果

时间:2015-05-17 12:37:41

标签: php mysql mysqli

好的,我将尝试改写暂停的问题。我的数据库中有一个名为anime的表,它的外观如下:

enter image description here

下面的代码主要关注数据库中的标签行,这些标签行的标签如下所示:tag1,tag2,tag3等。

我试图通过从下拉选项菜单(3个下拉菜单)中选择关键字(标签)进行搜索,因为所有关键字(标签)都是固定的,数据库中的标签是固定的(相同)我可以用

$tag_x = "tag1";
$tag_y = "";
$tag_z = "";

$tag_search = "%(?=.*$tag_x)(?=.*$tag_y)(?=.*$tag_z)%";

 // Connect to Database
require 'connect.php';

$sql = "SELECT id, title, category FROM anime";
$result = $conn->query($sql);

if ($result->num_rows > 0)
    {
    // output data of each row
    while ($row = $result->fetch_assoc())
        {
        $tags = $row["category"];
        if (preg_match($tag_search, $tags)) { 
            echo $row["id"];
        }       
        }
    }
  else
    {
    echo "0 results";
    }
$conn->close();

此代码可以显示1-3个关键字(标签)的匹配

问题是我不认为这是一个很好的方法,我也需要运行它三次以获得一个结果列表,首先有3个匹配,然后是2个匹配,然后是1个标记匹配,在列表中

//////以下的旧问题是保持不变。 (不确定我是否应该删除。)///////////

您好我是mysqli和数据库的新手我一直在尝试找到一种方法来过滤掉SELECT查询并显示结果。

我有一个数据库,其中包含所有具有相关标签的项目列表,我试图在用户进行搜索查询时显示行(及其信息)(通过下拉菜单)。数据如下所示:

ID  NAME        TAGS                CAT IMG_FILE_NAME
1   demo one    tag1, tag2, tag3    ... something.png
2   demo two    tag2, tag4          ... something.png
3   demo three  tag0                ... something.png
4   demo four   tag3, tag4, tag5    ... something.png
5   demo five   ...                 ... something.png
6   ...         ...                 ... ...

搜索将像这样工作

<label for="x">I am looking for:</label>
<select id="x">
  <option value="t1">Tag 1</option>
  <option value="t2">Tag 2</option>
  <option value="t3">Tag 3</option>
</select>

<label for="y">That has:</label>
<select id="y">
  <option value="t4">Tag 4</option>
  <option value="t5">Tag 5</option>
  <option value="t6">Tag 6</option>
</select>

<label for="z">and is:</label>
<select id="z">
  <option value="t7">Tag 7</option>
  <option value="t8">Tag 8</option>
  <option value="t9">Tag 9</option>
</select>

用户可以选择x = tag 2 y = tag 5 z = tag 8

然后点击搜索或者去它会从数据库中拉出/显示带有所选标签的结果,并显示带有下一个最接近匹配标签的标签(2个标签,然后是1个标签等)。

WHERE语句可以这样做吗?

我认为我找到这个问题答案的问题有90%是我在第一时间写这个问题,但是经过3个多小时寻找有效的东西而没有找到任何东西这似乎是最好的地方再问一遍!任何帮助都会很棒!和代码/代码链接将非常有吸引力!

2 个答案:

答案 0 :(得分:4)

TAGS列中以逗号分隔的值不是最佳值。你可以这样做,

SELECT NAME, CAT, IMG_FILE_NAME
  FROM item
 WHERE TAGS LIKE CONCAT('%', ?tag1, '%')
   AND TAGS LIKE CONCAT('%', ?tag2, '%')
   AND TAGS LIKE CONCAT('%', ?tag3, '%')

其中?tag1等是您的用户提供的值。但是这种通配符匹配(例如WHERE TAGS LIKE '%tag3%')容易出错,如果你的表很大,则非常慢。 (如果您的用户为您提供的标签少于三个,则您需要使用少于三个WHERE条款。

你想要这个好吗?将标记放在它们自己的tag表中,其列如下:

item_id
tag

因此,如果id = 2的项目有tag2和tag4,那么tag表中将有两行

 2  tag2
 2  tag4

然后,您可以使用此类查询进行搜索

SELECT COUNT(*) MATCHES, i.NAME, i.CAT, i.IMG_FILE_NAME
  FROM tag t
  JOIN item i ON t.item_id = i.id
 WHERE t.tag = ?tag1
    OR t.tag = ?tag2
    OR t.tag = ?tag3
 GROUP BY i.NAME, i.CAT, i.IMG_FILE_NAME
 ORDER BY COUNT(*) DESC, i.NAME

这将为您提供与用户指定的任何或所有标记匹配的项目列表,以及与首先列出的更多标记相匹配的项目。

答案 1 :(得分:1)

是的,你应该写一些类似的东西:

SELECT field_a, field_b FROM table WHERE field_x='2' AND field_y='5' AND field_z='8'
很明显,你必须让它适应你的桌子和你的字段名称,但可以给你一个提示。 根据您的评论,您应该执行以下操作:

SELECT field_a, field_b FROM table WHERE tags='2, 5, 8'

但请注意,这将查找确切的字符串。因此,如果您有一行tag = '5,2,8'(相同的标签但订单不同),您将无法获得结果。 最好(恕我直言)使用tag_1,tag_2和tag_3这三个列并将每个值存储在一列中?所以我的第一个例子将成为

SELECT field_a, field_b FROM table WHERE tag_1='2' AND tag_2='5' AND tag_3='8'