知道mysql咨询中哪个条件不匹配

时间:2012-03-17 22:15:41

标签: mysql conditional return-value

进入一个非常高的选择性MySQL查询,有没有办法知道哪个条件不匹配? 例如:如果我正在寻找12个条件并且我的MySQL返回0,这12个条件中的一个不匹配?

SELECT
    article.id,
    article.name,
    GROUP_CONCAT(tags.name order by tags.name) AS nameTags,
    GROUP_CONCAT(tags.id order by tags.id) AS idTags,
    MAX(IF(article.name LIKE '%var1%',1,0)) AS var1match,
    MAX(IF(article.name LIKE '%var2%',1,0)) AS var2match,
    and more 10 conditions.
FROM
    article
    LEFT JOIN ....
    LEFT JOIN ....
GROUP BY id
HAVING
    (nameTags LIKE '%var1%' OR var1match=1)
    AND (nameTags LIKE '%var2%' OR var2match=1)
    AND more 10 conditions.

我的意思是,不做12个单一咨询就可以看到哪一个没有结果。


更新:进行了一些演变

如果我这样做:

SELECT
    article.id,
        MAX(IF(article.name LIKE '%var1%',1,0) AS var1,
        MAX(IF(article.name LIKE '%var2%',1,0) AS var2,
        MAX(IF(article.name LIKE '%var3%',1,0) AS var3,
FROM
    article
    LEFT JOIN ....
    LEFT JOIN ....
GROUP BY article.id

我会得到一个像这样的别名表

|id|var1|var2|var3|
| 1|   0|   0|   1|
| 2|   0|   1|   0|
| 3|   0|   0|   0|
| 4|   0|   1|   1|

所以我知道'var 1'与条件不匹配,因为所有列值都等于0.我如何得到该列名的返回值?

尝试对值求和并获取sum = 0的列。不知道该怎么做。


更新 发现这样做是使用临时表。

1)创建tmp表:

CREATE TEMPORARY TABLE tmp_tagReport AS
SELECT
    article.id,
        MAX(IF(article.name LIKE '%var1%',1,0) AS l_var1,
        MAX(IF(article.name LIKE '%var2%',1,0) AS l_var2,
        MAX(IF(article.name LIKE '%var3%',1,0) AS l_var3,
FROM
    article
    LEFT JOIN ....
    LEFT JOIN ....
GROUP BY article.id

你会有这样的事情:

|id|l_var1|l_var2|l_var3|
| 1|     0|     0|     1|
| 2|     0|     1|     0|
| 3|     0|     0|     0|
| 4|     0|     1|     1|

2)总和值,您将知道0列没有匹配

SELECT
 SUM(l_var1) as l_var1,
 SUM(l_var2) as l_var2,
 SUM(l_var3) as l_var3

你会得到这样的东西:

|l_var1|l_var2|l_var3|
|     0|     2|     2|

3)获取PHP中带value = 0的列的名称

$querySelect = "SELECT
 SUM(l_var1) as l_var1,
 SUM(l_var2) as l_var2,
 SUM(l_var3) as l_var3
";
$result = mysql_query($querySelect);
$arrayUnfound = array_keys(@mysql_fetch_assoc($result), "0");
print_r($arrayUnfound)

4)这是一个临时表,但我添加了一个drop table,以确保并尝试释放内存:

mysql_query("DROP TABLE tmp_tagReport; ");

我发现自己是一种方法,但仍需要进行2次或更多次查询。但是我希望它可能有所帮助。

抱歉我的英文

由于

0 个答案:

没有答案