-1

我有一个可以标记图像的数据库。

为了标记它们,我在名为 Tagged 的​​数据库表中放置了一个值(表示颜色)

已标记

  ImgId  (example 5)
  TagId  (example 3)

我还有一张名为标签(颜色)的表

标签

  TagId   (example 3)
  Tag     (example blue)

在带有标签的列表中几乎有 20 个标签。

我所拥有的是一个带有图像的页面,所以 1 页是 imageid 5

如果我打开页面,我想要标签中所有标签的列表

如果 TagId 在 Tagged 它必须像

已选择标记 ID

否则只是

标签 ID

我怎样才能做到这一点。

我有数据库可以标记图像,但如果使用了标记,我无法让它“查看”。

是)我有的:

$sql = "SELECT *
        FROM Tags";
        $result = mysql_query("$sql");

    while($row = mysql_fetch_array($result))
      {
        
            echo "<input type=\"checkbox\" name=\"color[]\" value=\"".$row['TagId']."\">";
        
        echo $row['TagId'];
        echo "<br>";
      }

我想我需要加入或最好的方法是什么?

PS 我知道我应该使用 mysqli 但我现在使用 mysql 进行测试我稍后将其调整为 mysqli

4

2 回答 2

3

您可以使用 a LEFT JOINwith aGROUP BY对数据库进行一次查询并获得完整的结果;

SELECT Tag, COUNT(ImgId) selected
FROM TAGS 
LEFT JOIN TAGGED
  ON tags.TagId = TAGGED.TagId
 AND TAGGED.ImgId = 5
GROUP BY Tag;

一个用于测试的 SQLfiddle

一个简短的解释;

我使用 aLEFT JOIN选择所有tags和所有可能匹配的条目taggedwith ImgId=5。如果没有匹配,则值为ImgIdNULL,如果有匹配,则为5。这是 的一个特点LEFT JOIN

ImgId然后我计算每个标签的 's 数量( COUNT 和 GROUP BY 这样做)。NULL 不计数,因此计数变为 0,而 5 计数并给出计数 1(请记住,我们仅限于命中单个 ImgId,5)。

于 2013-05-03T12:51:36.070 回答
0

尝试

$sqlTagged = "SELECT TagId
    FROM Tagged WHERE ImgId=".$YouImgId;
$result = mysql_query($sqlTagged);
$arrTagged = array();
while($row = mysql_fetch_array($result))
{
    $arrTagged[] = $row["TagId"];
}
$sql = "SELECT *
    FROM Tags";
$result = mysql_query("$sql");

while($row = mysql_fetch_array($result))
{
    $selected = (in_array($row['TagId'],$arrTagged) ? "checked='checked'" : "";
        echo "<input type=\"checkbox\" name=\"color[]\"  ".$selected." value=\"".$row['TagId']."\">";

  }
于 2013-05-03T12:50:21.050 回答