如何在where子句中获取每个名称最多两个条目
如何在where子句中获取每个名称最多两个条目
我想要实现的是在限制条件下选择多个值。\n
SELECT id FROM table WHERE name IN ('Tom', 'Tommy') LIMIT 2
\n我知道这个查询不会按预期工作,但这只是一个例子。\n我对这种情况有点搞不清楚。\n我期望的输出是:\n
id 1 5 4 8
\n为了明确起见,LIMIT将每个变量返回{limit}行。\nLIMIT 3将每个返回3行\n
id 1 5 6 4 8
\n表格:\n
id, name 1, Tom 2, Jeff 3, Jason 4, Tommy 5, Tom 6, Tom 7, Jeff 8, Tommy
问题的出现原因:
- 需要在WHERE子句中获取每个名称的最多两个条目。
解决方法:
- 不要使用像上面示例中的union
语句。
- 使用WHERE IN (.....)
子句为每个用户使用一个SELECT查询,并在后面进行union操作。
- 在最后添加Order by name,id
以按照名称和ID排序。
- 如果需要union多个名称,可以构建一个存储过程或在所使用的语言中构建查询,如PHP
。
- 在每个查询中至少需要一个order by id
,以确保每个名称的ID按照升序排列。
如下是整理后的文章:
为了在WHERE子句中获取每个名称的最多两个条目,我们不能简单地使用类似于上面示例中的union
语句。相反,我们需要为每个用户在WHERE IN子句中使用一个SELECT查询,并在后面进行union操作。
此外,我们还需要在最后添加Order by name,id
,以按照名称和ID对结果进行排序。这样可以确保结果按照预期的顺序排列。
如果我们需要union多个名称,可以考虑构建一个存储过程或在所使用的语言中构建查询,如PHP
。这样可以更好地管理和组织代码。
需要注意的是,在每个查询中至少需要一个order by id
,以确保每个名称的ID按照升序排列。否则,结果中的ID可能以不同的顺序出现,与预期不符。
问题的出现原因是需要从给定的数据中获取每个姓名最多两个条目,但是查询语句中没有明确的限制条件。解决方法是添加限制条件 WHERE t.rank < 2
来筛选出每个姓名最多两个条目的数据。
首先,根据姓名升序对数据进行排序:
SELECT id, `name` FROM your_table WHERE `name` IN ('Tom','Tommy') ORDER BY `name`
排序后的结果如下:
id name 1 Tom 5 Tom 6 Tom 4 Tommy 8 Tommy
然后,使用 变量来跟踪每个姓名是否已经出现过,使用
变量为每个姓名分配一个排名。如果当前姓名已经出现过,则将排名加1(类似于学号)。
通过上述两个变量,中间表的结果如下:
id name rank 1 Tom 0(第一次出现,排名为0) 5 Tom 1(第二次出现,排名为1) 6 Tom 2(第三次出现,排名为2) 4 Tommy 0(第一次出现,排名为0) 8 Tommy 1(第二次出现,排名为1)
最后,根据 rank < 2
的条件筛选出每个姓名最多两个条目的数据。