2008-09-20 42 views
1

我有一个表y其中有两列ab根据结果数量我可以将我的MySQL查询重构为一个查询吗?

的项目有:

a b 

1 2 

1 3 

1 4 

0 5 

0 2 

0 4 

我想2,3,4如果我搜索栏a 1和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,您偏离默认值。

回答

2

我想我有它:

SELECT b FROM y where a=if(@value IN (select a from y group by a),@value,0); 

它检查是否@value存在于表中,如果没有,那么它使用0作为默认值。 @@@@也可以是一个php值。

希望它能帮助:)

0

您可以使用单个参数在单个存储过程中执行所有操作。

我必须用完,但我会尽力为你写一个,并在我从我的差事中回来后立即添加。

+0

大。当谈到存储过程时,我完全无能为力。 一般来说,我只会问,如果在存储过程中执行它会比我上面提出的PHP版本更好。我的本能会说'是的,如果数据库是在不同的服务器上,而不是其他'。 – 2008-09-20 15:16:56

+0

存储过程总是更好。其他人给出的解决方案都很好,但是,一般情况下,向客户端发送尽可能多的信息以回报您所需的信息,因为您需要的信息一般都很好,如果客户端是单独的计算机,则无关紧要比服务器 – 2008-09-20 18:59:18

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 

您将与

GetRealElseGetDefault 1

基于一个快速谷歌搜索运行这个(在SQL Server),存在快速在MySQL。列A被编入索引会特别快。如果你的桌子足够大让你担心表现,那么它可能足够大以便进行索引。

+0

我不知道为什么这被标记 - 请教育我。这是一个有效的,经过测试的存储过程,我回答了这个问题。 OP没有要求在PHP中回答。 ?? – CindyH 2008-09-22 13:48:24

2

你可以尝试这样的事情。我不是100%确定它会工作,因为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 
) 
+0

我想我不能接受两个答案,但这些都是正确的,我测试了他们,并且我已经尽可能最好地投票了他们。 – 2008-09-20 18:35:04

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"; 
    } 
} 

一个查询,但如果开销有很多 '零' 值。
如果你关心的开销取决于...

1

我想在基于服务器的性能我看来米哈尔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; 
相关问题