[英]MySQL SELECT Query - Exluding certain rows
我有一个包含一堆轮胎品牌和信息的数据库。 我有一个名为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查询中排除,或者以其他方式使下拉列表仅显示他们未使用的品牌列表?
谢谢!
您必须使用这样的子查询:
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,brand是否已在Accepted_Brands表中
您可以将查询修改为:
SELECT id, name
FROM tire_brands
WHERE id NOT IN (SELECT brand_id FROM Accepted_Brands WHERE shop_id = current_shop)
SELECT id, name FROM tire_brands WHERE name NOT IN (....,....,....) ORDER BY name
...以....
代表您传入的轮胎的逗号分隔名称。
尝试
SELECT t.id, t.name FROM tire_brands as t, Accepted_Brands as a WHERE t.id <> a.brand_id ORDER BY name
因此您可以从结果集中排除已设置的品牌。
您需要执行更复杂的查询,以查找商店已经拥有的品牌,并将这些品牌从您要填充到下拉菜单的主品牌列表中排除。 在不知道您的表结构的情况下,以下仅是一个示例:
SELECT id, name
FROM tire_brands
WHERE (id NOT IN (
SELECT brand_id
FROM store_carried_brands
WHERE store_id = XXX
))
ORDER BY name
并且可以肯定的是,提交“添加品牌”表格时,请在服务器端进行一些检查,并且仅在该品牌不在其随身携带的品牌列表中时,才将该品牌添加到商店中。 即使您没有使用上述查询过滤可用的品牌,也可以通过检查添加此“新”品牌是否确实会创建重复项来阻止重复项的创建。
尝试这个:
SELECT id, name FROM tire_brands
WHERE id NOT IN (SELECT tire_brand_id FROM Accepted_Brands WHERE shop_id=XXX)
ORDER BY name
如果您最关心的是他们两次添加同一品牌,那么您可以做的另一件事是在“ accepted_brands”表上添加唯一索引,因此无法添加“ tire_id”和“ shop_id”的相同组合。
就像是:
ALTER TABLE accepted_brands ADD UNIQUE INDEX (tire_id, shop_id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.