MySQL SELECT Query - 排除某些行

时间:2011-10-12 15:30:13

标签: php mysql

我有一个包含大量轮胎品牌和信息的数据库。我有一个名为 Accepted_Brands 的表格,其中包含shop_id和brand_id,因此它告诉我哪个商店带有哪个品牌。

tire_brands 表只有一个ID和一个名字,列出了所有轮胎品牌。

在该特定商店的页面上,我列出了他们销售的所有轮胎品牌..并且可以选择添加新品牌。

添加新品牌弹出窗口只有一个下拉列表,这是我的代码:

    if ($result = $mysqli->query('SELECT id, name FROM tire_brands ORDER BY name')) { 

        while( $row = $result->fetch_assoc()){ 
            $tire_name = $row['name'];
            $tire_id = $row['id'];

            echo "<option value=\"".$tire_id."\">".$tire_name."</option>";
        }

因此,它显示所有轮胎品牌的下拉列表,他们可以选择将其添加到他们接受的列表中。问题是它显示了所有这些,即使它已被选中。所以我可以添加两个相同的品牌。

有没有办法将它从SELECT查询或其他方式中排除,以便下拉列表只能显示他们不使用的品牌列表?

谢谢!

7 个答案:

答案 0 :(得分:3)

你必须使用这样的子查询:

 if ($result = $mysqli->query('SELECT id, name FROM tire_brands where id NOT IN (select shop_id from Accepted_Brands) ORDER BY name')) { 

        while( $row = $result->fetch_assoc()){ 
            $tire_name = $row['name'];
            $tire_id = $row['id'];

            echo "<option value=\"".$tire_id."\">".$tire_name."</option>";
        }

这只是一个示例,我不知道您如何在Accepted_Brands上插入数据以及如何理解ID,品牌是否已经在您的Accepted_Brands表中

答案 1 :(得分:2)

您可以将查询修改为:

SELECT id, name 
  FROM tire_brands 
  WHERE id NOT IN (SELECT brand_id FROM Accepted_Brands WHERE shop_id = current_shop)

答案 2 :(得分:1)

SELECT id, name FROM tire_brands WHERE name NOT IN (....,....,....) ORDER BY name

... ....代表您传递的轮胎的逗号分隔名称。

答案 3 :(得分:1)

尝试

SELECT t.id, t.name FROM tire_brands as t, Accepted_Brands as a WHERE t.id <> a.brand_id ORDER BY name

这样您就可以排除已经从结果集中设置的品牌。

答案 4 :(得分:1)

您需要执行更复杂的查询来查找商店已经拥有的品牌,并将您填入下拉菜单的主要品牌列表中的商品排除在外。在不知道您的表结构的情况下,以下只是一个示例:

SELECT id, name
FROM tire_brands
WHERE (id NOT IN (
    SELECT brand_id
    FROM store_carried_brands
    WHERE store_id = XXX
))
ORDER BY name

而且,确保在提交“添加品牌”表单时进行一些服务器端检查,并且只有在品牌列表中尚未添加该品牌时才将其添加到商店。即使您没有使用上述查询过滤可用品牌,也可以通过检查添加此“新”品牌是否实际上会产生欺骗来阻止创建重复项。

答案 5 :(得分:1)

试试这个:

SELECT id, name FROM tire_brands 
WHERE id NOT IN (SELECT tire_brand_id FROM Accepted_Brands WHERE shop_id=XXX)
ORDER BY name

答案 6 :(得分:1)

如果你最关心他们两次添加同一品牌,你可以做的另一件事就是在'accepted_brands'表上添加一个独特的索引,所以'tire_id'和'shop_id'的组合可以'加入。

类似的东西:

ALTER TABLE accepted_brands ADD UNIQUE INDEX (tire_id, shop_id);