循环mysql查询的WHERE部分

时间:2013-03-16 18:55:25

标签: php mysql loops

我正在尝试确定与某个类别相关的主题组合是否唯一。在向类别添加主题时完成此操作。使用此查询检查唯一性:

$sql_unique = "SELECT Categories_CategoryID, list
FROM (

SELECT Categories_CategoryID, GROUP_CONCAT( Topics_TopicID ) AS list
FROM (

SELECT *
FROM Topics_crosstable
ORDER BY Topics_TopicID
)H
GROUP BY Categories_CategoryID
)A
WHERE list = (
SELECT GROUP_concat( TopicID )
FROM Topics
WHERE Name = 'nr1'
OR Name = 'nr2'
ORDER BY Categories_CategoryID ASC )";


$result = mysql_query($sql_unique);
echo mysql_num_rows($result);

 if($result > 1)
 {
    echo' HELP! It is not unique';
 }
 else
 {
 echo ' getshere';
 }

这很好用。但问题是,添加的主题数量是不同的。那么有什么方法可以在查询的where部分中包含for循环吗?

类似于(添加的主题数量; nr ++){OR Name =',$ inserted_topicName'}

2 个答案:

答案 0 :(得分:1)

利用'WHERE ... IN':

WHERE Name IN ('nr1','nr2',...)

string implode ( string $glue , array $pieces );

使用如下:

$options = array(); //here's your choices

$sql_unique = "SELECT Categories_CategoryID, list
               FROM (
             SELECT Categories_CategoryID, GROUP_CONCAT( Topics_TopicID ) AS list
             FROM (
                SELECT *
                FROM Topics_crosstable
                ORDER BY Topics_TopicID
             )H
             GROUP BY Categories_CategoryID
                )A
                WHERE list = (
             SELECT GROUP_concat( TopicID )
             FROM Topics
             WHERE Name IN (";
$sql_unique .= implode(",",$options);
$sql_unique .= ") ORDER BY Categories_CategoryID ASC )";

答案 1 :(得分:0)

类别

  • CATID

主题

  • topID
  • 类别

分类:主题(1:n)

问题:类别$x是否有唯一的主题集?

首先获得类别$x

的所有主题的总和
SELECT GROUP_CONCAT(topID ORDER BY topID) topiclist
FROM Topics
WHERE category='$x'

您可能需要展开{​​{1}}并向该数组添加一些新值,我假设将上述查询的结果提取到关联数组topiclist

$r

然后再次查询数据库,试图找到不包括我正在查询的类别的组合:

$list=explode(',',$r['topiclist']);
$list[]=$newtopicID1;
$list[]=$newtopicID2;
// etc ... or use $list += $newTopicsArray; which will ADD those two arrays
sort($list); //make it sorted again
$list=implode(',',$list);

然后检查是否有返回的记录。如果是,那么您找到了具有相同主题的另一个类别,如果没有,则主题组合是唯一的