用于检查表列

时间:2017-08-14 18:18:31

标签: sql

我有一个表格,其中列中的项目按逻辑分组。我需要检查表上是否已存在项目列表。我需要检查确切的清单数量。

enter image description here

这是我的表结构,如果我搜索我的列表(“Rick”和“Max”),我应该得到组ID 2.但是,如果我只搜索“Rick”我不应该得到任何结果回来。

3 个答案:

答案 0 :(得分:0)

您可以使用子查询来获取组和名称,使用GROUP BY上的GroupId,以逗号分隔的组名(有序),然后检查您的输入。< / p>

例如,在MySQL中。

   SELECT * FROM (SELECT GroupId, GROUP_CONCAT(Name order by Name) AS "ConcNames"
   FROM my_table 
   GROUP BY GroupId) subQueryTable WHERE subQueryTable.ConcNames= 'Max,Rick';

会给你:

------------------
GroupId  ConcNames
2        Max,Rick

然后针对ConcNames列检查您的参数(您的输入名称也应已订购

SQL Fiddle

答案 1 :(得分:0)

在这里你使用MySQL:

SELECT groupID,
       count(*),
  (SELECT group_concat(NAME separator ' and ')
   FROM TABLE_NAME table2
   WHERE table1.groupID=table2.groupID) RESULT
FROM TABLE_NAME table1
GROUP BY groupID

enter image description here

http://sqlfiddle.com/#!9/5cc34/5

答案 2 :(得分:0)

这是一个有趣的问题!

我确信这是一个更优雅的解决方案,但我的推荐是这样的:

SELECT DISTINCT GroupID FROM test_table WHERE
    (name='Rick' OR name='Max') #... You could add more 'OR's here
    AND
    (SELECT COUNT(name) FROM test_table WHERE GroupID=(SELECT DISTINCT GroupID FROM test_table WHERE name='Rick')) # This only needs one name from the list
    =
    (SELECT COUNT(name) FROM test_table WHERE (name='Rick' or name='Max')) # The same WHERE clause as the first one

您还需要确保只返回一行。

作为如何使用它的一个例子,如果你在PHP中工作,给定一个要检查的名称数组和一个MySQL连接$ con,你可以这样做:

<?php

$names = array('Rick', 'Max'); // The names to check

$whereClause = '';
$index = 0;
foreach($names as $name) {
    if($index != 0) {
        $whereClause .= ' OR ';
    }
    $whereClause .= "name='{$name}'";
    $index++;
}

$query = "SELECT DISTINCT GroupID FROM test_table WHERE
({$whereClause})
    AND
    (SELECT COUNT(name) FROM test_table WHERE GroupID=(SELECT DISTINCT GroupID FROM test_table WHERE name='{$names[0]}'))
        =
    (SELECT COUNT(name) FROM test_table WHERE ({$whereClause}))";

$results = mysqli_query($con, $query);

$is_group = true;
$group_number = -1;
$n_groups = 0;
while($row = mysqli_fetch_assoc($results)) {
    $n_groups++;
    if($n_groups > 1) {
        $is_group = false;
    }
    $group_number = intval($row['GroupID']);
}

// The group number is now stored in $group_number, provided that $is_group == true.

?>

希望我帮忙!我已经验证了我自己的MySQL数据库中的SQL代码,但没有验证PHP代码。