【问题标题】:Help with Join帮助加入
【发布时间】:2009-06-28 22:03:32
【问题描述】:

我认为我需要加入帮助。想不通。

我有这些表:

帖子

`id` int(10) unsigned NOT NULL,
`title` varchar(140) DEFAULT NULL,
`text` text COLLATE utf8_unicode_ci

帖子标签

`post_id` int(10) unsigned NOT NULL,
`tag_id` int(10) unsigned NOT NULL

标签

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL

如果我想循环出所有带有标签 team-fortress-2 的帖子,该怎么做?我想不通。

$q = mysql_query("SELECT * FROM ... WHERE $get['tag']");
while($r = mysql_fetch_array($q)) {

【问题讨论】:

    标签: php sql mysql join


    【解决方案1】:
    SELECT p.*
    FROM posts p
    JOIN posttags pt ON pt.post_id = p.id
    JOIN tags t ON pt.tag_id = t.id
    WHERE t.name = 'team-fortress-2'
    

    是具体的例子。在 PHP 中你会这样做:

    $tag = mysql_real_escape_string($get['tag']);
    $sql = <<<END
    SELECT p.*
    FROM posts p
    JOIN posttags pt ON pt.post_id = p.id
    JOIN tags t ON pt.tag_id = t.id
    WHERE t.name = '$tag'
    END;
    $query = mysql_query($sql);
    if (!$query) {
      $error = mysql_error();
      die("Error $error for query $sql");
    }
    ...
    

    转义标签非常重要,尤其是当您以任何方式从用户输入中接受它时。

    【讨论】:

    • +1 用于转义用户输入的警告(防止 SQL 注入)
    【解决方案2】:

    SQL 应该如下所示:

    select
       p.id, p.title, p.text
    from
       Posts p
       inner join PostTags pt on pt.post_id = p.id
       inner join Tags t on t.id = pt.tag_id
    where
       t.name = 'team-fortress-2'
    

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多