【问题标题】:How can i exclude some records from an mysql query based on another query如何根据另一个查询从 mysql 查询中排除一些记录
【发布时间】:2015-01-21 21:44:11
【问题描述】:

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

我有 3 张桌子:

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

Songs表中我存储了一个歌曲列表,Tags表有一个标签列表,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

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

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

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

    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];
    

    【讨论】:

    • 非常好的解决方案,在 SELECT 部分中使用 IS NOT NULL :)
    【解决方案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 } ?>
    

    【讨论】:

      【解决方案3】:

      我会创建两个 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 部分未经测试,但应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2020-09-23
        • 1970-01-01
        • 2014-04-11
        • 2014-02-21
        相关资源
        最近更新 更多