Помощь с Присоединиться

0

Мне нужна помощь в соединении, я думаю. Не могу понять.

У меня есть следующие таблицы:

Сообщения

`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)) {
Теги:
join

2 ответа

6
Лучший ответ
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");
}
...

Экранирование тега действительно важно, особенно если вы принимаете его с пользовательского ввода каким-либо образом.

  • 0
    p.post_id должен быть pt.post_id ...
  • 1
    +1 за предупреждение о выходе из пользовательского ввода (предотвращение внедрения SQL)
1

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'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню