我可以根据结果数量将MySQL查询重构为一个查询吗?

时间:2008-09-20 14:21:38

标签: php sql mysql

我有一个表y,其中包含两列ab

参赛作品是:

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。

6 个答案:

答案 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被索引,那将特别快。如果你的表足够大,你可以担心性能,它可能足以索引。