进入一个非常高的选择性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次或更多次查询。但是我希望它可能有所帮助。
抱歉我的英文
由于