Mysql 基于第一个表在第二个表中查找的SQL复杂查询
我一直在思考如何做这几乎2天了,但仍然没有结果。如果有人能给我指点或者帮我做这个SQL语句,我将不胜感激。所以我有这些桌子Mysql 基于第一个表在第二个表中查找的SQL复杂查询,mysql,sql,sql-server,Mysql,Sql,Sql Server,我一直在思考如何做这几乎2天了,但仍然没有结果。如果有人能给我指点或者帮我做这个SQL语句,我将不胜感激。所以我有这些桌子 Table1 NameField Mark John Chris Tina Charles Table2 NameField ItemField Mark Pencil Mark Bag Mark Paper Mark Book John Book John Ba
Table1
NameField
Mark
John
Chris
Tina
Charles
Table2
NameField ItemField
Mark Pencil
Mark Bag
Mark Paper
Mark Book
John Book
John Ballpen
Chris Bag
Chris Paper
Chris Pencil
Tina Ballpen
Charles Computer
Charles Book
Charles Pencil
Charles Box
Charles Shoes
如何生成基于这些条件查询数据的SQL语句
从表1中获取所有名称字段,其中ItemField有包、纸和铅笔
结果:
Chris
Mark, Chris
Mark - 3 - Bag, Paper, Book
Chris - 2 - Bag, Paper
Charles - 4 - Computer, Book, Box, Shoes
b从表1中获取所有名称字段,其中ItemField有袋子、纸和铅笔,并带有额外的0或1或2个随机项字段
结果:
Chris
Mark, Chris
Mark - 3 - Bag, Paper, Book
Chris - 2 - Bag, Paper
Charles - 4 - Computer, Book, Box, Shoes
c从表1中获取所有名称字段,其中ItemField有铅笔,而不管ItemField是否有其他项目,并计算额外的项目,包括项目铅笔并列出额外的项目
结果:
Chris
Mark, Chris
Mark - 3 - Bag, Paper, Book
Chris - 2 - Bag, Paper
Charles - 4 - Computer, Book, Box, Shoes
我曾尝试在服务器端脚本语言的帮助下完成这项工作,方法是循环表1中的每个名称字段,然后再次循环每个项目字段。所以,若我在表下有1000个项目,我就需要遍历1000个项目。这个解决方案效率低得可笑。所以,我很抱歉,如果我不能把任何代码,我已经到目前为止,因为我真的没有一个。什么也没冒出来。这是我遇到的第一个这样的问题。多谢各位 我试了一下,只用了表2 一, 二, 三, 它确实需要输入匹配的项目数,但希望能有所帮助
编辑:查询A非常简单,因此我将从以下内容开始:
SELECT Namefield FROM Table2
WHERE ItemField IN ('Bag', 'Paper', 'Pencil')
GROUP BY NameField
HAVING count(*) = 3;
查询B:在子查询中使用与上面相同的查询,但检查总体项目计数是否小于或等于5,则允许0,1,2额外的查询
SELECT Namefield FROM Table2
WHERE NameField IN
(SELECT Namefield FROM Table2 WHERE ItemField IN ('Bag', 'Paper', 'Pencil') GROUP BY NameField HAVING count(*) = 3)
GROUP BY NameField
HAVING count(*) <= 5;
查询C:我认为pssdbt的结果最好。但是请注意,包含多个类似项的内容可能应该由服务器端语言而不是SQL来处理。SQL是一种数据的平面表示。我对其他人的看法略有不同,但它确实需要一些前期工作,例如使检查字符串字母化。 我的查询的好处是它支持对同一物品进行多次计数,例如获得3支铅笔和2个包 受到@pssdbt答案的启发 查询A:
SELECT NameField, GROUP_CONCAT(ItemField ORDER BY ItemField) AS MatchedItems
FROM Table2
GROUP BY NameField
HAVING MatchedItems = "Bag,Paper,Pencil";
问题B:
SELECT NameField, GROUP_CONCAT(DISTINCT ItemField ORDER BY ItemField) AS MatchedItems ,
count(ItemField) as totalCount
FROM Table2
GROUP BY NameField
HAVING MatchedItems LIKE "%Bag%Paper%Pencil%" AND totalCount <= 5;
这些查询都不需要表1,因为表2中存在名称字段。请在sqlfiddle.com上创建一个fiddle,我会帮助您的。@Devon是的,先生。。。我现在正在做…您需要一个查询来满足所有三个条件,还是三个查询?这是mysql还是SQLServer?非常感谢您的帮助,先生,我会尝试一下并尽快向您报告:非常感谢您,先生。我仍然试图在SQLFIDLE:+1的帮助下理解其中的每一点,因为查询C看起来像他想要的。查询A+B只需要名称字段,因此可能更简单。@pssdbt向上投票并标记您的答案,先生。非常感谢你帮助我!问题是它包括任何拥有这些物品的人,也不排除那些拥有更多物品的人。是的,我试过了@pssdbt是对的。不过,还是要谢谢你。@pssdbt你说得对,我错过了have。@chris_techno25现在应该可以了,我忘了包含have count*,所以它与所有的have count都匹配了。@Devon是的,先生:我目前正在尝试用我不太有用的想法来改变你的陈述。我只是尝试使用不同的语句,如果它们返回相同的结果。非常感谢。我真的很感激。了解所有信息后,我将更新: