我有一个包含大量轮胎品牌和信息的数据库。我有一个名为 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查询或其他方式中排除,以便下拉列表只能显示他们不使用的品牌列表?
谢谢!
答案 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);