当一个字段可能包含或不包含值时,mysql选择数据

时间:2012-04-27 20:06:30

标签: php mysql

有一个MYSQL查找表,它返回多个格式(points_id)的多个终结者(N)中某个地点(P)收到的点数。不同的点结构用于不同的事件。有时候获得的分数取决于终结者的数量(N)有时他们没有。 这是表的简短版本,有两个样本结构。 points_id -1这些点取决于N Point_id -2,这些点没有。

       points_id |   P   |   N   | points |
           1     |   1   |   3   |   90   |
           1     |   1   |   2   |   85   |
           1     |   1   |   1   |   80   |
           1     |   2   |   3   |   60   |
           1     |   2   |   2   |   50   |
           1     |   3   |   3   |   30   |
           3     |   1   |       |  100   |
           3     |   2   |       |   90   |
           3     |   3   |       |   80   |
           3     |   3   |       |   70   |

所以我的问题: 1)有没有办法将通配符放在表数据中。 例如,如果显示空白的N列中有一个% 我做了这个查询。

SELECT points from t1 WHERE points_id=3 and P=3 and N=2 

它会返回96 ?? PS我知道这不起作用,但显示了我的想法。

2)我希望它快,可以把它放在一个程序中用于更大的查询。我猜测,除非有一个非常简单的方法来做我上面显示的。最快的方法是在points_id = 3的情况下为所有不同的N提供行。这是真的吗?

2 个答案:

答案 0 :(得分:0)

您可以考虑UNION ALL:

SELECT points from t1 WHERE points_id=3 AND P=3
UNION ALL
SELECT points from t1 WHERE points_id=3 AND N=2 

无论P = 3还是N = 2,都会得到结果。我复制了你的数据库模式并尝试了这个,它产生了:

points
------
80
70

如果您确实想要快速处理大量数据 - 您真的希望拥有索引和/或主键。

答案 1 :(得分:0)

试试这个:

SELECT points from t1 WHERE points_id=3 and P=3 and (N=2 OR (IFNULL(N,'')='')) 
// dataType of N varchar
SELECT points from t1 WHERE points_id=3 and P=3 and (N=2 OR (IFNULL(N,0)=0))
//  dataType of N numeric type

让我知道是否有任何改变或错误