Mysql查询问题

Mysql查询问题,mysql,Mysql,我有一个mysql表,其中包含以下列: id (autoincremented primary key) user_id test_id test_score 如何获取与参与测试的用户相关的所有测试数据_id=5。我想要参与该特定测试的用户的所有测试数据(不仅仅是test_id 5) 如果我正确理解了你的问题,那么基本的方法就是将表本身连接起来 select allTestData.* from TEST_TABLE allTestData left outer join (select us

我有一个mysql表,其中包含以下列:

id (autoincremented primary key)
user_id
test_id
test_score

如何获取与参与测试的用户相关的所有测试数据_id=5。我想要参与该特定测试的用户的所有测试数据(不仅仅是test_id 5)

如果我正确理解了你的问题,那么基本的方法就是将表本身连接起来

select allTestData.* from TEST_TABLE allTestData
left outer join (select user_id from TEST_TABLE where test_id = 5) testIdFive
on allTestData.user_id = testIdFive.user_id

如果我正确理解了你的问题,那么基本的方法就是将表本身连接起来

select allTestData.* from TEST_TABLE allTestData
left outer join (select user_id from TEST_TABLE where test_id = 5) testIdFive
on allTestData.user_id = testIdFive.user_id

我相信这会让你得到你想要的

SELECT * 
  FROM table 
  WHERE user_id IN 
   (SELECT DISTINCT user_id 
    FROM table
      WHERE test_id = 5)

我相信这会让你得到你想要的

SELECT * 
  FROM table 
  WHERE user_id IN 
   (SELECT DISTINCT user_id 
    FROM table
      WHERE test_id = 5)
试试这个查询

SELECT test data 
FROM TABLENAME 
WHERE user_id IN (
  SELECT user_id 
  FROM TABLENAME 
  WHERE test_id = 5
)
试试这个查询

SELECT test data 
FROM TABLENAME 
WHERE user_id IN (
  SELECT user_id 
  FROM TABLENAME 
  WHERE test_id = 5
)

听起来你想做一个自我加入。类似的方法将利用索引(假设您在
user\u id
上有一个索引,在
test\u id
上有一个索引,您应该这样做):


我想这引出了另一个问题。您的表是如何索引的?只是数字主键?您通常希望在联接或WHERE子句中使用的所有列上都有索引。因此,您希望在
user\u id
上有一个索引,在
test\u id
上有一个索引


用户可以多次参加相同的测试吗?如果没有,那么您希望通过在
user\u id
test\u id
之间使用唯一的多列(“复合”)索引来限制这一点。然后为WHERE子句添加一个常规索引以测试id。类似的方法将利用索引(假设您在
user\u id
上有一个索引,在
test\u id
上有一个索引,您应该这样做):


我想这引出了另一个问题。您的表是如何索引的?只是数字主键?您通常希望在联接或WHERE子句中使用的所有列上都有索引。因此,您希望在
user\u id
上有一个索引,在
test\u id
上有一个索引



用户可以多次参加相同的测试吗?如果没有,那么您希望通过在
user\u id
test\u id
之间使用唯一的多列(“复合”)索引来限制这一点。然后在WHERE子句的
test\u id
中添加一个常规索引。

您的意思不仅仅是user\u id 5?你的第一句话和第二句话在我看来是矛盾的。你能再解释一下吗?@Mahesh如果用户参加了测试5,请返回该用户所有测试的所有测试结果。这就是我的理解。你的意思不仅仅是用户id 5?你的第一句话和第二句话在我看来是矛盾的。你能再解释一下吗?@Mahesh如果用户参加了测试5,请返回该用户所有测试的所有测试结果。这就是我对它的理解。这与-
select*fromtest_id=5。更简单的是,嵌套的select不如join操作有效,因为它对中的每一行执行一次嵌套的selectTABLENAME@Mahesh-您的查询没有返回他需要的结果。@AndrewR-可能我误解了OP。谢谢:)@jkschneider我不是MySql专家,但我认为在这种情况下,子查询只执行一次。这两个查询之间没有任何依赖关系,子查询中的WHERE有一个硬值。我没有解释过,但我认为这只是两个简单的查询。更简单的是,嵌套的select不如join操作有效,因为它对中的每一行执行一次嵌套的selectTABLENAME@Mahesh-您的查询没有返回他需要的结果。@AndrewR-可能我误解了OP。谢谢:)@jkschneider我不是MySql专家,但我认为在这种情况下,子查询只执行一次。这两个查询之间没有任何依赖关系,子查询中的WHERE有一个硬值。我还没有解释清楚,但我认为这只是两个简单的查询。嵌套选择不如联接操作有效,因为它对TableName中的每一行执行一次嵌套选择。在这里,您可以将所有testdata绑定到用户。嵌套选择不如联接操作有效,因为它对TableName中的每一行执行一次嵌套选择TableName在这里您可以获得所有与用户相关的testdata。虽然这产生了与@AndrewR解决方案相同的结果,但您的解决方案执行起来稍微快一点。谢谢@维尼很乐意帮忙。我认为,随着用户数量和测试结果的大幅增长,速度上的差异将变得越来越明显。对于我的基本测试(大约1000条记录),由于使用了索引,这比其他建议的解决方案快一到两个数量级。虽然这产生了与@AndrewR解决方案相同的结果,但您的解决方案执行起来稍微快一点。谢谢@维尼很乐意帮忙。我认为,随着用户数量和测试结果的大幅增长,速度上的差异将变得越来越明显。对于我的基本测试(大约1000条记录),由于使用了索引,这比其他建议的解决方案快一到两个数量级。