首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从一个表中选择一个字段,该表是另一个表的一个字段中包含的字符串的一部分?

如何从一个表中选择一个字段,该表是另一个表的一个字段中包含的字符串的一部分?
EN

Stack Overflow用户
提问于 2011-07-05 02:46:42
回答 2查看 914关注 0票数 2

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

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

我想要的是选择所有的‘标签’从表‘标签’,这是标签在同一字符串的‘标签’的表‘条目’,有一个给定的标签(变量$tag)。但是不知道,我只是尝试从表'entry‘中选择标记,其中的字符串在’$tag‘中包含指定的标记(变量.My),当前的代码是

代码语言:javascript
运行
复制
$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];
      }
    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-05 03:32:49

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

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

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

代码语言:javascript
运行
复制
<?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第1卷:避免数据库编程的缺陷”中写了一章,详细介绍了这个设计引起的实际问题。

票数 2
EN

Stack Overflow用户

发布于 2011-07-05 03:08:00

将其作为一条语句执行的超级低效SQL注入攻击方法如下:

代码语言:javascript
运行
复制
$sql="SELECT tags FROM entry WHERE 1=1 ";

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

代码语言:javascript
运行
复制
$sql.="AND tag LIKE '" . $tags1[$loop] . "' ";

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

不过,我确实建议对标记进行规范化,并考虑不以这种方式构建SQL查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6577583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档