当前位置: 首页 > 面试题库 >

MySQL多对多选择

陆子默
2023-03-14
问题内容

仍在学习MySQL的绳索,我试图找出如何进行涉及多对多的特定选择。如果表名太通用,我深表歉意,我只是在做一些自制的练习。我尽力成为一名自学者。

我有3个表,其中一个是链接表。如何编写 “显示哪些用户同时拥有HTC和Samsung手机”
(他们拥有2部手机)的语句。我猜答案在WHERE语句中,但我不知道该怎么写。

-- Table: mark3
+---------+-----------+
| phoneid | name      |
+---------+-----------+
|       1 | HTC       |
|       2 | Nokia     |
|       3 | Samsung   |
|       4 | Motorolla |
+---------+-----------+

-- Table: mark4
+------+---------+
| uid  | phoneid |
+------+---------+
|    1 |       1 |
|    1 |       2 |
|    2 |       1 |
|    2 |       3 |
|    2 |       4 |
|    3 |       1 |
|    3 |       3 |
+------+---------+

-- Table: mark5
+------+-------+
| uid  | name  |
+------+-------+
|    1 | John  |
|    2 | Paul  |
|    3 | Peter |
+------+-------+

问题答案:

关键是在GROUP BY / HAVING中使用COUNT个DISTINCT电话名称。当计数为2时,您将知道用户同时拥有 两部 电话。

SELECT m5.name
    FROM mark5 m5
        INNER JOIN mark4 m4
            ON m5.uid = m4.uid
        INNER JOIN mark3 m3
            ON m4.phoneid = m3.phoneid
    WHERE m3.name in ('HTC', 'Samsung')
    GROUP BY m5.name
    HAVING COUNT(DISTINCT m3.name) = 2;


 类似资料:
  • 我已经开始开发我的第一个MySQL数据库,我遇到了一个简单的问题。 我将我的电影按“多对多”关系进行分类: 我试图做的是按类型搜索我的电影表,并显示每部电影的所有类型,例如: 这是一个我用来搜索恐怖电影的查询 我遇到的问题是,这个查询在筛选之前检索所有表的全部,我收集的结果非常低效。有没有更好的方法可以在显示所有相关类型的同时按一种类型搜索?

  • 问题内容: 这里完全没有想法,可能需要一个简单的解决方案。 基本上我想要的查询是: 我只想选择ID为3和4的行,或者命名为“ andy”和“ paul” 非常感谢您的回答 问题答案: 尝试: 或等效的:

  • 问题内容: 有点复杂的问题,但是,基本上我有很多表: 它是和关系的列表。我需要查询以查找word_a和word_b之间的关系是否存在。如果单词可以是单词A或单词b,那么正确的语法是什么? 在我的脑海里 这似乎不起作用,因为我得到了任何一场比赛的结果。有人熟悉这种情况并知道正确的语法吗? 提前致谢。 问题答案: 这应该工作:

  • 问题内容: 产生5行(5个数组),是一行中唯一的唯一字段。重复( 在这里 重复3次。 )我如何摆脱这些重复? 编辑: 我想要和所有为每个饮料。 问题答案: 您在这里所做的称为a (尽管您是隐式执行的,因为您是从多个表中选择的)。这意味着,如果您未在WHERE子句中放置任何条件,则您将拥有这些表的 所有组合 。仅根据您的条件,您才可以将联接限制为饮料ID匹配的行。 但是,如果有X张包含此特定Drin

  • 问题内容: 如何根据“ DateAdded”字段选择一个字段的使用天数? 例如: 问题答案: 使用: 参考:DATEDIFF DATEDIFF()返回expr1到expr2,表示为从一个日期到另一个日期的天数值。

  • 问题内容: 编辑: 直到这里,我得到适当的4行,但它们都是相同的结果(我知道我需要4行,但是有不同的结果) 我的问题是,如何仅通过LotteryOfferId来通过多对多表检索所有彩票? 我要实现的是通过LotteryDrawDateId从彩票表中获取数据。 首先,我使用LotteryOfferId从中间表获取DrawDates,然后通过中间表获取drawDateIds以在LotteryDrawD