如何从基于另一个查询的mysql查询中排除一些记录

时间:2015-01-21 21:44:12

标签: php mysql sql

我需要从表中排除一些记录并显示它们,然后,我需要显示其他记录,这些记录被排除在外。

我有3张桌子:

+----Songs----+   +----Tags----+   +----s_in_tag----+
|     id      |   |     id     |   |       id       |
|    title    |   |    name    |   |     song_id    |
+-------------+   +------------+   |      tag_id    |
                                   +----------------+

在表格歌曲中,我存储了一系列歌曲,表格标记包含标记列表,表格 s_in_tag 绑定这两个表格。

假设我有歌曲:1,歌曲nr1。在标签:1,POP; 2,说唱; 3,经典。在 s_in_tag 中:1,3,2。 这意味着 song nr1 具有标签 Classical

我希望能够在我的信息中心中添加/删除标签,但是如何进行正确的查询以获取所有歌曲标签,并将其显示为已选中的复选框,然后是表格中的其他标签标签是未经核查的复选框?

到目前为止我已经得到了这个:

SELECT * FROM tags
JOIN s_in_tag
ON tags.id = s_in_tag.tag_id
WHERE s_in_tag.song_id = *song id*
AND s_in_tag.tag_id NOT IN (SELECT tags.id FROM tags) GROUP BY tags.id

我只是尝试在互联网上找到的东西,希望有人可以帮助我。

3 个答案:

答案 0 :(得分:5)

为什么不在同一个查询中包含它们?

SELECT t.id, t.name, st.id IS NOT NULL AS is_checked
  FROM Tags t
  LEFT JOIN s_in_tag st ON t.id = st.tag_id AND st.song_id = [song_id];

答案 1 :(得分:2)

试试这个:

<?php
// Query 
$sql = "SELECT t.id, t.`name` AS tag, IF(st.`id`, 'checked', 'unchecked') AS checkstatus
FROM tags t
LEFT JOIN s_in_tag st ON st.`tag_id` = t.`id`";

$rs = mysql_query($sql);
while ($row = mysql_fetch_assoc($rs)) { 
$checked = $row['checkstatus'] ? ' checked="checked" ' : '';
?>
<p><input type="checkbox" <?php print $checked; ?> /> <?php print $row['tag']; ?> </p>  
<?php } ?>

答案 2 :(得分:0)

我会创建两个SQL查询。一个可以获取所有标签,另一个可以使用所有标签。

$allTags = "SELECT * FROM tags";
$usedTags = "SELECT * FROM s_in_tag;

在php图层上,您遍历$ allTags数组,并在每次迭代中查看$ usedTags数组,如果它包含当前标记,则将其标记为已选中。

foreach($allTags as $key=>$value)
{
    if (in_array($value, $usedTags))
    {
        echo "<input type='checkbox' checked /> ".$value;
    }
    else
    {
        echo "<input type='checkbox' /> ".$value;
    }
}

php部分未经过测试但应该可以使用。