我必须使用给定的数据库。
我找到了这篇文章,但没有成功地根据我的需要进行调整:
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”列:
应该只返回所有subject1条目中的一行或不返回。
请求示例
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声明,如果这是不可避免的?
是否有更好(或更快)的方法来过滤表格?
提前谢谢。
答案 0 :(得分: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)
)
请注意,要使其正常工作,每个SELECT
个人最多只能返回一行。在您的情况下,{a, d}
的任意组合必须不超过一行。