2017-08-14 52 views
0

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

enter image description here

这是我的表结构,如果我对搜索我的名单(“瑞克”和“Max),我应该得到的组ID 2。但是,如果我只是搜索‘里克’我不应该得到任何结果回来。

+2

您使用什么查询来执行搜索?你还使用什么样的SQL? – yanman1234

+0

为什么只搜索“Rick”时不会得到结果?该值在表中有一个“GroupId”。是否有额外的标准,你想申请但没有描述? –

+0

整个目的是重新使用现有的组。如果输入人员列表不属于任何组,我将创建一个新组。因此,有必要确定现有的组。 – pijushcse

回答

0

您可以使用子查询来获取组和名称,在使用GroupIdGROUP BY,组名逗号分隔(有序),然后检查您输入反对。

对于例如,在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

+0

你应该考虑字符串字段的长度限制,无论是...... – hummingBird

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

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连接$骗子,你可以这样做:

<?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代码。