我有一个表y
,其中包含两列a
和b
参赛作品是:
a b
1 2
1 3
1 4
0 5
0 2
0 4
如果我将列a
搜索为1,我希望得到2,3,4,如果我搜索列a
,我希望得到5,2,4。
所以,如果我在A中搜索A中的内容,(1)我得到那些行,如果给定值没有条目A,请给我'默认值'(a
='0 “)
以下是我将如何理解的方法:
$r = mysql_query('SELECT `b` FROM `y` WHERE `a` = \'1\';');
//This gives desired results, 3 rows
$r = mysql_query('SELECT `b` FROM `y` WHERE `a` = \'2\';');
//This does not give desired results yet.
//Get the number of rows, and then get the 'defaults'
if(mysql_num_rows($r) === 0) $r = mysql_query('SELECT `b` FROM `y` WHERE `a` = 0;');
所以,现在已经充分解释了,我如何在一个查询中做到这一点,以及性能问题呢?
最常用的部分是第三个查询,因为只有a
中的值才会出现偏离默认值的数字IF。
答案 0 :(得分:2)
你可以尝试这样的事情。我不是百分之百确定它会起作用,因为count()是一个聚合函数,但值得一试。
SELECT b
FROM table1
WHERE a = (
SELECT
CASE count(b)
WHEN 0 THEN :default_value
ELSE :passed_value
END
FROM table1
WHERE a = :passed_value
)
答案 1 :(得分:2)
我想我拥有它:
SELECT b FROM y where a=if(@value IN (select a from y group by a),@value,0);
它检查表中是否存在@value,如果不存在,则默认使用0。 @value也可以是php值。
希望有所帮助:)
答案 2 :(得分:1)
怎么样?
$rows = $db->fetchAll('select a, b FROM y WHERE a IN (2, 0) ORDER BY a DESC');
if(count($rows) > 0) {
$a = $rows[0]['a'];
$i = 0;
while($rows[$i]['a'] === $a) {
echo $rows[$i++]['b']."\n";
}
}
一个查询,但如果存在大量“零”值则会增加开销 取决于你是否关心开销...
答案 3 :(得分:1)
我认为Michal Kralik在我看来是基于服务器性能的最佳答案。为这种简单的逻辑做子选择或存储过程确实不值得。
我改进Michal逻辑的唯一方法是在一个脚本中多次执行此查询。在这种情况下,我会首先查询0,然后运行每个单独的查询,然后检查是否有任何值。
伪代码
// get the value for hte zero's
$zeros = $db->fetchAll('select a, b FROM y WHERE a = 0');
//checking for 1's
$ones = $db->fetchAll('select a, b FROM y WHERE a = 1');
if(empty($ones)) $ones = $zeros;
//checking for 2's
$twos = $db->fetchAll('select a, b FROM y WHERE a = 2');
if(empty($twos)) $twos = $zeros;
//checking for 3's
$threes = $db->fetchAll('select a, b FROM y WHERE a = 3');
if(empty($threes)) $threes = $zeros;
答案 4 :(得分:0)
您可以使用单个参数在单个存储过程中完成所有这些操作。
我必须跑出去,但我会尽力为你写一个,并在我从我的差事回来后立即将其添加到这里。
答案 5 :(得分:0)
我不知道为什么会被标记下来 - 请教育我。它是一个有效的,经过测试的存储过程,我回答了这个问题。 OP并不要求答案在php中。 ??
这是一个存储过程,可以在SQL Server中执行您想要的操作。我不确定MySQL。
create proc GetRealElseGetDefault (@key as int)
as
begin
-- Use this default if the correct data is not found
declare @default int
select @default = 0
-- See if the desired data exists, and if so, get it.
-- Otherwise, get defaults.
if exists (select * from TableY where a = @key)
select b from TableY where a = @key
else
select b from TableY where a = @default
end -- GetRealElseGetDefault
你可以用
运行它(在sql server中)GetRealElseGetDefault 1
基于快速谷歌搜索,MySQL中的存在速度很快。如果列A被索引,那将特别快。如果你的表足够大,你可以担心性能,它可能足以索引。