Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 多次选择与映射表匹配的多个项目_Mysql_Join - Fatal编程技术网

Mysql 多次选择与映射表匹配的多个项目

Mysql 多次选择与映射表匹配的多个项目,mysql,join,Mysql,Join,我试图选择具有特定主题id的问题。这些匹配项存储在映射表中,但我无法确定如何选择具有两个标记的问题,因为它们存储在表中的不同行中!需要帮忙吗 SELECT questions. * , posts.post, posts.id AS post_id, posts.created, users.id AS user_id, users.username, users.rep FROM questions LEFT JOIN posts ON questions.id = posts.questio

我试图选择具有特定主题id的问题。这些匹配项存储在映射表中,但我无法确定如何选择具有两个标记的问题,因为它们存储在表中的不同行中!需要帮忙吗

SELECT questions. * , posts.post, posts.id AS post_id, posts.created, users.id AS user_id, users.username, users.rep
FROM questions
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LEFT JOIN topic_mapping ON questions.id = topic_mapping.question_id
WHERE topic_mapping.topic_id =49
OR topic_mapping.topic_id =50
GROUP BY questions.id
LIMIT 0 , 30

要找到同时指定了两个主题的问题,请测试HAVING子句中找到的不同主题的数量。此数量应与WHERE子句中包含的主题数量相匹配

SELECT questions. * , posts.post, posts.id AS post_id, posts.created, users.id AS user_id, users.username, users.rep
FROM questions
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LEFT JOIN topic_mapping ON questions.id = topic_mapping.question_id
WHERE topic_mapping.topic_id IN (49,50)
GROUP BY questions.id
HAVING COUNT(DISTINCT topic_mapping.topic_id) = 2
LIMIT 0 , 30

要获取问题ID,请使用
HAVING
子句:

SELECT
  questions.id
FROM questions LEFT JOIN topic_mapping ON questions.user_id = topic_mapping.question_id
WHERE topic_id = 49 OR topic_id = 50
GROUP BY questions.id
HAVING COUNT(DISTINCT topic_id) = 2
这样做的结果是一个问题id列表,然后可以将这些问题id与您对
问题的其余查询进行合并。id
检索
分组依据中未包含的其余列。因此,整个过程看起来是这样的:

SELECT 
  questions.* , 
  posts.post,
  posts.id AS post_id,
  posts.created, 
  users.id AS user_id,
  users.username, 
  users.rep
FROM questions
JOIN (
    /* subquery gets the posts with 2 topics */
    SELECT
      questions.id
    FROM questions LEFT JOIN topic_mapping ON questions.user_id = topic_mapping.question_id
    WHERE topic_id = 49 OR topic_id = 50
    GROUP BY questions.id
    HAVING COUNT(DISTINCT topic_id) = 2
) qtopics ON questions.id = qtopics.id
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LIMIT 0 , 30

我不太明白,你能再解释一下吗?@youngcouple10看到我上面的加法。谢谢迈克尔,但它不会给我任何结果!那我可能误解了你的要求。如果@joestefanelli的答案对你有用,就坚持使用它you@youngcouple10哈哈,乔和我都不需要代表积分。他知道MySQL的内容。谢谢,你能解释一下in的功能吗?我想这就像是一个平等检查。为什么有了商业就解决了问题。但是你的代码确实有效!!IN只是多个OR语句的语法速记。HAVING business保证找到的不同主题的数量(在您的示例中为2)与in列表中列举的数量相匹配。谢谢Joe!最后一个问题,为什么当我省略DISTINCT时,它只返回只有一个标记的问题?为什么当我不使用have时,它不起作用并返回带有一个标签的问题?将在几分钟内接受,具体取决于您的数据。如果数据库设置为每个主题只能与一个问题关联一次(例如,主题映射表中关于问题id和主题id的唯一索引),则不需要它。如果你不考虑所有的问题,你会得到分配了任一主题的问题,而不一定是分配了两个主题的问题。是的,但为什么?很抱歉打扰你,但是用简单的英语怎么回答这个问题呢