有没有办法检查mysql中是否存在记录?
Select name FROM test as p
Where (category = 'cat'
OR category = 'dog')
我想要实现的是来自测试表的查询名称,如果category是cat。如果此查询中没有记录,则查询类别为dog的位置。
如果类别猫可用,请不要查询类别狗。
一种方法是使用两个查询:一个用于猫,一个用于没有猫存在的狗。使用UNION ALL
将两个查询结果合二为一。
select name from test where category = 'cat'
union all
select name from test where category = 'dog'
where not exists (select * from test where category = 'cat');
你可以用一些左连接来做,它很昂贵,但它会工作:
Select p.name FROM test as p
LEFT JOIN test pCat ON pCat.id = p.id and pCat.category = 'cat'
LEFT JOIN test pDog ON pDog .id = p.id and pDog .category = 'dog'
WHERE other conditions
如果存在category =“cat”的行,则返回cats的名称。否则它会返回狗的名字。
SELECT IF(
(SELECT COUNT(id) FROM test WHERE category ="cat"),
(SELECT `name` FROM test WHERE category ="cat"),
(SELECT `name` FROM test WHERE category ="dog")
) FROM test
它可以在mysql中使用IF条件和内部查询来完成
select name, cat from test
where cat in (select IF(t.c1>0,'cat','dog') as cat from
(select count(cat) as c1 from test where cat='cat') t)
为了完整起见,我将展示如何在标准SQL中执行此操作。这在MySQL尚未提供,但可能在将来的版本中。
select name
from test
where category in ('cat', 'dog')
order by category
fetch first 1 row with ties;
你看我们按类别排序,然后取第一行(fetch first 1 row
- 猫行,如果有的话,狗行除了)和所有相同类别的行(with ties
)。
MySQL有一个LIMIT
子句(而不是FETCH FIRST n ROWS
),但它没有绑定子句,所以这里没用。
这是MySQL中的另一种方法:
select name
from test
where category in
(
select min(category)
from test
where category in ('cat', 'dog')
);