繁体   English   中英

如何 SELECT 一个字段形成一个表,该表是另一个表的一个字段中包含的字符串的一部分?

[英]How to SELECT one field form one table which is part of string contained in one field of another table?

使用 PHP 和 MYsql。 我有 2 张桌子

  • 表'tag':有字段'id'和'tag'('tag'是varchar)

  • 表'entry':有字段'tags'和其他字段('tags'是varchar,它存储许多单词作为标签,每个单词用逗号分隔。然后我使用function'explode'从字符串中提取标签以存储在数组中' $tags'。来自表 'entry' 的所有标签都存储在表 'tag' 中。)

我想要的是 select 表“标签”中的所有“标签”,它们是具有给定标签(变量 $tag)的表“条目”的同一“标签”字符串中的标签。 但不知道,我只是尝试从表'entry'中的SELECT标签,'tags'中的字符串包含指定的标签(变量$tag)。我当前的代码是

$count=0;
$sql="SELECT tags FROM entry WHERE tag LIKE '%$tag%'";
$result = mysql_query($sql);
while($data=mysql_fetch_array($result)){
  if(mysql_num_rows($result)!=0){
    $tags1=explode(',',$data['tags']);
    for($loop=0; $loop<=count($tags1)-1; $loop++){
      if(!in_array($tags1[$loop], $tags2)){
        $count+=1; 
        $tags2[$count]=$tags1[$loop];
      }
    }
  }
}

一种超级低效的 SQL 注入攻击倾向的方法是:

$sql="SELECT tags FROM entry WHERE 1=1 ";

然后在运行之前将每个标签添加到查询中:

$sql.="AND tag LIKE '" . $tags1[$loop] . "' ";

如果您想匹配任何标签而不是所有标签,请将AND替换为OR

我真的建议规范化标签并考虑不以这种方式构建 SQL 查询。

您在解决这个问题时遇到的困难都源于您将标签列表存储在单个列中的事实。

您确实需要添加一个交集表,以包含标签和条目之间多对多关系的数据。 这是设计关系数据库的正确方法,如果您这样做,许多 SQL 查询将变得更加高效。

例如,要从与标签$tag匹配的条目中获取所有标签:

<?php

$sql = "SELECT t1.tag FROM tag AS t1
INNER JOIN entries_tags AS e1 ON e1.tag = t1.id
INNER JOIN entries_tags AS e2 ON e2.entry = e1.entry
INNER JOIN tag AS t2 ON t2.id = e2.tag
WHERE t2.tag = ?";

$stmt = $pdo->prepare($sql);
$result = $stmt->execute( array($tag) );

$data = $result->fetchAll();
$count = count($data);

我在《 SQL Antipatterns: Avoiding the Pitfalls of Database Programming 》一书中写了一章详细介绍了这种设计引起的实际问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM