我有一个表格,其中列中的项目按逻辑分组。我需要检查表上是否已存在项目列表。我需要检查确切的清单数量。
这是我的表结构,如果我搜索我的列表(“Rick”和“Max”),我应该得到组ID 2.但是,如果我只搜索“Rick”我不应该得到任何结果回来。
答案 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
列检查您的参数(您的输入名称也应已订购)
答案 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
答案 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代码。