Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于第一个表在第二个表中查找的SQL复杂查询_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 基于第一个表在第二个表中查找的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

我一直在思考如何做这几乎2天了,但仍然没有结果。如果有人能给我指点或者帮我做这个SQL语句,我将不胜感激。所以我有这些桌子

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是的,先生:我目前正在尝试用我不太有用的想法来改变你的陈述。我只是尝试使用不同的语句,如果它们返回相同的结果。非常感谢。我真的很感激。了解所有信息后,我将更新: