1

我必须使用给定的数据库。

我找到了这篇文章,但没有成功地根据我的需要调整它:

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx

我想做的事

我使用 MYSQL 5 和 PHP 5.4。

数据库将同一主题的本地化条目设置为单行。

表结构

+---+--------+------------+--------+----+-----+  
|id |a       |b           |c       |d   |e    |  
+---+--------+------------+--------+----+-----+  
|1  |aaa     |German text |booked  |0   |1    |  
+---+--------+------------+--------+----+-----+  
|2  |aaa     |English text|booked  |1   |0.25 |  
+---+--------+------------+--------+----+-----+  
|3  |aaa     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|4  |bbb     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|5  |bbb     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|6  |ccc     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|7  |ccc     |English text|free    |1   |0.5  |  
+---+--------+------------+--------+----+-----+  
|8  |ddd     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|9  |ddd     |Russian text|booked  |5   |0.9  |  
+---+--------+------------+--------+----+-----+  
|10 |eee     |Italian text|free    |4   |1.2  |  
+---+--------+------------+--------+----+-----+  
|11 |eee     |English text|free    |1   |0.3  |  
+---+--------+------------+--------+----+-----+  

列:

a = subject  
b = localized text  
c = value  
d = language-key  
e = value  

我有多达三种不同的语言值来检查列“d”:

  • request_value(第一选择,如果为TRUE则取subject1的这一行)
  • fallback_value (如果 request_value 失败检查这个,如果 TRUE 采取这一行的 subject1)
  • default_value(如果 request_value 和 fallback_value 失败,请检查此项,如果 TRUE 则取该行的 subject1)
  • 如果所有三个检查都失败,则不会返回 subject1 的行。

应该只返回所有主题 1 条目中的一行或不返回。

请求示例

request_value = 0 (German)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 1, 4, 6, 8, 11  


request_value = 1 (English)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 8, 11  


request_value = 5 (Russian)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 9, 11  

我想到了 WHERE 语句中的一个条件,并希望避免使用 CASE 语句。

查询(原型):

SELECT a, b  
FROM table  
WHERE  
c = value1  
AND (check conditions for d)  
AND e > 0  

请问,如果这是不可避免的,是否有人可以给我 WHERE 语句,即使是 CASE 语句?

有没有更好(或更快)的方法来过滤表格?

先感谢您。

4

1 回答 1

1

您尝试做的与文章所做的非常不同:文章教如何在没有case语句的情况下在单行上重写条件;另一方面,您的任务需要必须跨多行工作的条件。换句话说,文章的条件是水平的,而您正在寻找垂直的。

构建选择单行的查询的一种方法是使用COALESCE. 假设table有一个名为 的主键id,您可以这样做:

-- Change these values as needed
SET @request_value = 5;
SET @fallback_value = 1;
SET @default_value = 0;

SELECT id
FROM test a
WHERE id = COALESCE (
  (SELECT ID FROM test b WHERE a.a=b.a AND d=@request_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@fallback_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@default_value)
)

这是关于 sqlfiddle 的演示

请注意,为了使其工作,每个人SELECT最多只能返回一行。在您的情况下, . 的任何组合不得超过一行{a, d}

于 2013-06-15T12:53:44.720 回答