mysql查询-按组选择具有特定值的不同值
我现在有 SELECT * FROM bidders WHERE status='0' AND email IS NOT NULL GROUP BY `bid_user` ORDER BY 'bid_price' DESC 我遇到的问题是,bid_用户可能存在于状态为1或状态为0的不同行中。 我想知道是否有可能仅选择状态为0且bid\U用户不存在且状态为1的*行以及上述条件,并且电子邮件不为空 按投标用户分组 按“投标价格”说明订购。mysql查询-按组选择具有特定值的不同值,sql,mysql,group-by,aggregate-functions,Sql,Mysql,Group By,Aggregate Functions,我现在有 SELECT * FROM bidders WHERE status='0' AND email IS NOT NULL GROUP BY `bid_user` ORDER BY 'bid_price' DESC 我遇到的问题是,bid_用户可能存在于状态为1或状态为0的不同行中。 我想知道是否有可能仅选择状态为0且bid\U用户不存在且状态为1的*行以及上述条件,并且电子邮件不为空 按投标用户分组 按“投标价格”说明订购。 我可以使用PHP+2 mysql查询解决这个问题,但
我可以使用PHP+2 mysql查询解决这个问题,但是在mysql中使用精确的查询要好得多。您可以通过将status='0'条件替换为status='0'或status='1'来实现这一点,并且bid_user为NULL如您所愿*status='0'和email不为NULL的行不使用GROUP by 根据@Michael的评论进行编辑 资料 所需O/p
id bid_price bid_user status
3 300 test2 0
SQL查询
SELECT * FROM bidders
WHERE bid_user NOT IN (select DISTINCT `bid_user` FROM `bidders` where status='1')
AND email IS NOT NULL
ORDER BY 'bid_price' DESC
假设您有关于bid_用户和状态的索引,则有可能表现更好的备选方案:
@salil我忘了添加我使用GROUP BY来获取基于唯一bid\u user的记录我的问题是如何获取状态为0但状态为1的不存在的唯一bid\u user行。@Michael:-你不认为状态为0的bid\u user不能具有状态为1吗,正如你所说的bid\u user是唯一的,如果有,意味着bid\u user不是唯一的吗unique@Salil在投标者表中,我可以有这样一种情况:1 id=1 bid\u price=100 bid\u user=teststatus=0-2 id=2 bid\u price=200 bid\u user=teststatus=1-3 id=3 bid\u price=300 bid\u user=tes2 status=0-因此我需要获得所有bid\u user中不存在的状态为0的行状态为1的行。如果存在2行或多行符合相同bid_用户的条件,我只需要在此处获取一行,我使用GROUP,使用当前语法获取第一行和第三行。但正如您所看到的,我需要排除第一行,因为bid\u user=test存在于状态为1的行中,您能解释一下语法status='0'或status='1',bid\u user为空吗?我不确定我是否理解正确,但它似乎选择了状态为0的行或状态为1且bid_user NULL的行,这不是我要查找的。此查询是否有效?您使用的是GROUP BY,但您选择的是所有字段,没有摘要函数。我认为查询应该使用count,但我对sql查询不太熟悉,因此不知道如何使用它properly@george查询是有效的。我使用GROUP BY只获取具有不同“bid_user”的记录,并按“bid_price”进行排序,但GROUP BY需要知道如何汇总结果集。通常,GROUPBY子句中不存在的任何字段都需要以某种方式进行汇总。所以,我还是不明白为什么它真的有效。这张桌子看起来像什么?SHOW CREATE TABLE bidders命令将提供信息。@George Marian:为了满足您的好奇心,MySQL扩展了GROUP BY-see的使用。这就是为什么Michael的查询从MySQL的角度来看是有效的。
id bid_price bid_user status
3 300 test2 0
SELECT * FROM bidders
WHERE bid_user NOT IN (select DISTINCT `bid_user` FROM `bidders` where status='1')
AND email IS NOT NULL
ORDER BY 'bid_price' DESC
SELECT
b.*
FROM
bidders b
WHERE
status='0'
AND email IS NOT NULL
AND not exists (
select 1 from bidders bx where bx.status='1' and bx.bid_user = b.bid_user
)
ORDER BY 'bid_price' DESC