我需要从表中排除一些记录并显示它们,然后,我需要显示其他记录,这些记录被排除在外。
我有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
我只是尝试在互联网上找到的东西,希望有人可以帮助我。
答案 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部分未经过测试但应该可以使用。