我正在尝试编写一个查询,它连接三个表,按id列分组,并查找列的最大值。但是,如果给定行没有值,则会从结果集中删除整个表行。
我有一个拍卖网站,有不同的物品。我在展示 price
作为 max(bid)
在名为“活动出价”的页面上的项目旁边。我的问题是,如果一个项目没有出价,那么该项目是不会出现在页面上,直到它收到了第一次出价。
我还有一个专栏 min_price
因此,如果在bid列中没有添加任何值,我仍然会显示一个最小价格。
是否可以显示 max(bid)
为空,但仍要显示该项吗?简而言之,我要问的是,即使其中一列没有插入值(该列没有插入值),如何显示表行 null
接受,但仍然没有结果)。
我的问题是:
SELECT COALESCE(max(bid.amount) , 0) AS amount, item.img, item.expirydate, item.iditem, item.description, item.min_price, seller.name
FROM item,seller,bid
WHERE seller.idseller=item.idseller
AND idcategory=1
and
bid.iditem=item.iditem
AND item.expirydate> curdate()
group by iditem;"
;
PHP:
<?php $datasett = $tilkobling->query($sql);
<?php while ($rad=mysqli_fetch_array($datasett)) { ?>
<tr>
<div class="artikkelbilde" id="tabell">
<td>
<img class="artikkelbilde" src="../images/<?php echo $rad ["img"];?>">
</td>
</td>
</div>
<td>
<?php echo $rad["iditem"]; ?>
</td>
<td>
<?php echo $rad["description"]; ?>
</td>
<td>
<?php echo $rad["min_price"]; ?>
</td>
<td>
<?= $rad["name"]; ?>
</td>
<td>
<?php echo $rad["expirydate"]; ?>
</td>
<td>
<?php echo $rad["amount"]; ?>
</td>
<td>
<a href="Gibud.php"> Gi bud </a>
</td>
<?php } ?>`
下面是三个相关表的sql,信息量绝对最小,但原理应该相同。我正在努力让sql在项目没有出价时检索项目:
CREATE TABLE `bid` (
`idbid` INT NOT NULL AUTO_INCREMENT,
`amount` INT NOT NULL,
`idbuyer` INT NULL,
`iditem` INT NULL,
PRIMARY KEY (`idbid`)
);
CREATE TABLE `item` (
`iditem` INT NOT NULL AUTO_INCREMENT,
`min_price` INT NULL,
`description` VARCHAR(45) NULL,
`idseller` INT NULL,
`idcategory` INT NULL,
PRIMARY KEY (`iditem`)
);
CREATE TABLE `seller` (
`idseller` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`idseller`)
);
ALTER TABLE `bid`
ADD INDEX `FK_item_idx` (`iditem` ASC);
ALTER TABLE `bid`
ADD CONSTRAINT `FK_item`
FOREIGN KEY (`iditem`)
REFERENCES `item` (`iditem`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `item`
ADD INDEX `FK_seller_idx` (`idseller` ASC);
ALTER TABLE `item`
ADD CONSTRAINT `FK_seller`
FOREIGN KEY (`idseller`)
REFERENCES `seller` (`idseller`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
INSERT INTO `item` (`min_price`, `description`) VALUES ('200', 'coffeetable');
INSERT INTO `item` (`min_price`, `description`) VALUES ('400', 'lamp');
INSERT INTO `item` (`min_price`, `description`) VALUES ('600', 'painting');
INSERT INTO `bid` (`amount`, `iditem`) VALUES ('800', '1');
INSERT INTO `bid` (`amount`,`iditem`) VALUES ('1000','2');
INSERT INTO `seller` (`name`) VALUES ('Bob');
INSERT INTO `seller` (`name`) VALUES ('Rob');
INSERT INTO `seller` (`name`) VALUES ('Tob');
UPDATE `item` SET `idseller`='1' WHERE `iditem`='1';
UPDATE `item` SET `idseller`='1' WHERE `iditem`='2';
UPDATE `item` SET `idseller`='2' WHERE `iditem`='3';
3条答案
按热度按时间mbyulnm01#
你在mysql中使用过coalesce吗??
我想你应该在你的询问中有这样的内容
coalesce返回列表中的第一个非空表达式
q9rjltbz2#
您需要在查询中编写正确的联接,而不是依赖于from[table1,table2]语句,因为它只使用常规联接。
你可能想要这样的东西:
ps:我没有添加你的
idcategory=1
因为我不确定它出现在哪个表中。内部连接将尝试连接一个记录,如果找不到该记录,它将添加
null
对于要选择的每个内部联接字段,coalesce将选择第一个参数,如果第一个参数是,则选择第二个参数null
.qf9go6mv3#
根据您发布的三个表的示例数据,您可以使用
LEFT JOIN
以确保iditem
保留值。因此,当联接的表与左侧的表不同步时,您将看到NULL
价值观。下面是我的sqlfiddle演示,以证明在示例数据上查询是成功的。
执行连接时,应包括
ON
决定哪些列充当粘合剂的子句。这个
WHERE
子句现在可以根据您的项目需求进行配置。一定要弄清楚某些列来自哪个表,这样就不会因为歧义而出错。backtick Package tablenames和columns可能有点过分(有些开发人员不喜欢膨胀),但是我发现这在消除意外使用保留mysql字的可能性方面是明智的。