我的数据库字段名为tag_info
,我将拥有如下所示的数据:
手臂腿部前臂脚
标签以空格分隔。 (不确定这是否是最好的方式,所以我愿意接受建议)
现在我需要编写一个查询,它将返回tag_info字段中具有特定标记的所有行。但是我正在寻找的标签并不是所有都需要存在,至少其中一个标记就是这样。
$find_tags = array("arm,"leg");
$query = "SELECT * FROM mydatabase WHERE tag_info = '$find_tags'
这可能吗?
答案 0 :(得分:3)
您应该首先更改数据库架构。而不是存储由空格分隔的标签。
你能告诉我你的表的架构(列名)吗?我认为这是一个你应该有两张桌子的情况。一个单独的表格,仅用于标签。
答案 1 :(得分:2)
这不是标记的好方法。您应该有一个标签表(id,name),yourdatabase_tags(yourdatabaserecord_id,tag_id),这样您就可以将数据库表中的记录与标签表中的标签相关联。
因此,当您有一个标记列表时,请执行查询以获取其ID,然后查询yourdatabase_tags以获取具有该tag_ids的record_ids,然后在数据库中查询记录。或者你可以将它们组合成一个查询(这是为读者留下的练习:)))
答案 2 :(得分:1)
Mysql语法无法正常工作
这将起作用。
$query = "SELECT * FROM mydatabase
WHERE tag_info = '".$find_tags[0]."' OR tag_info = '".$find_tags[1]."'";
在您的情况下,由于标签都在一个字段中,您可以使用外卡:%
$query = "SELECT * FROM mydatabase
WHERE tag_info LIKE '%".$find_tags[0]."%' OR tag_info LIKE '%".$find_tags[1]."%'";
答案 3 :(得分:1)
使用where tag_info like '%arm%' or tag_info like '%leg%'
查询
但这样效率会非常低,最好是每行分别存储一个标签,并在其上加上索引。
答案 4 :(得分:1)
无法编写类似的查询,因为您必须动态更改WHERE等等或等等的OR语句数量。一种方法是将数据库中的所有数据都捕获到PHP数组中。一旦进入数组,您可以以编程方式搜索结果并消除那些不匹配的结果。
如果您只想搜索特定查询,则可以搜索不同的标记 $ find_tags = array(“arm,”leg“);其他答案都可以。
答案 5 :(得分:1)
您可以尝试以下查询。
$query = "SELECT * FROM mydatabase WHERE tag_info IN ('$find_tags');
如果您使用的是表名和字段名,那么您可能需要这样做。
感谢。
答案 6 :(得分:1)
$keywords = array("arm", "leg");
$length = count($keywords);
$searchCriteria = '';
for($i = 0; $i < $length; $i++)
{
$searchCriteria = $searchCriteria . "tag_info like '%" . $keywords[$i] . "%'";
if( ($i+1) < $length)
$searchCriteria = $searchCriteria . " OR ";
}
$query = "SELECT * FROM mydatabase
WHERE $searchCriteria";
您可能需要添加一些额外的检查,以确保在包含标记的数组为空时不会遇到错误。
答案 7 :(得分:1)
更正确的方法是使用带有availeble标签的标签表以及tag_info和tag_table之间的链接表。
但这是一个带有查询的解决方案
$query = "SELECT * FROM mydatabase WHERE ";
foreach($find_tags as $tag)
{
$query .= "tag_field LIKE %$tag% OR ";
}
$query = substr($query, 0, strlen($query) - 3);
未经测试!!
答案 8 :(得分:0)
您的查询应该类似于
SELECT * FROM mydatabase WHERE tag_info = 'arm' OR tag_info = 'leg'
您还可以使用MySQL IN
子句:
SELECT * FROM mydatabase WHERE tag_info IN ('arm', 'leg')
这种方式更容易构建查询字符串
修改强>
我刚看到你拿着在数据库中序列化的标签。现在,这绝对不是好事,因为你正在摧毁结构化数据的概念。
您应该创建一个名为tags
的表,并将每个标记保存在自己的行中。然后在要标记的表(现在保存序列化标记的表)和标记表之间创建另一个数据透视表。
数据透视表只能容纳2个字段 - main_table_id
和tag_id
- 这样,您就可以使用以下单个连接查询数据库:
SELECT t.* FROM tags t
INNER JOIN pivot_table pt ON pt.tag_id = t.id
INNER JOIN main_table mt ON mt.id = pt.main_table_id
WHERE tag IN ('arm', 'leg')
答案 9 :(得分:0)
当然,在WHERE子句中使用LIKE而不是=。
SELECT * FROM mydatabase WHERE tag_info LIKE '% foot %' or tag_info LIKE '% leg %'