【问题标题】:SQL - Find the next row ID in sequenceSQL - 按顺序查找下一行 ID
【发布时间】:2014-08-01 09:15:59
【问题描述】:

我有两个表 TESTS 和 TESTS_ATTEMPTED。我正在尝试为给定 USER_ID 的每种测试类型(数学、英语、科学)输出下一个测试的 ID。

表格的结构如下(带有一些示例数据):

TESTS
================
 ID    TEST_NAME   TEST_TYPE
  1     Science 1   Science
  2     Maths 1     Maths
  3     Maths 2     Maths
  4     Science 2   Science

TESTS_ATTEMPTED
================
ID   TEST_ID   USER_ID 
 1     1          2 
 2     1          1 
 3     2          2  
 4     3          2  

这里有一个带有这个虚拟数据的 SQL 小提琴:http://www.sqlfiddle.com/#!2/43efb/2

预期结果将是(对于用户 ID 2):

TEST_TYPE   NUM_TESTS   NUM_TAKEN   NEXT_TEST_ID    
Science       2            1         4
Maths         2            2         Null

我已经能够创建一个包含用户测试次数的查询,但不确定是否可以输出下一个测试类型?

SELECT count(*) as num_tests_taken, 
    TEST_NAME from TEST_NAMES tn 
INNER JOIN TESTS_ATTEMPTED ta on tn.ID = ta.TEST_ID AND ta.USER_ID = 2 
GROUP BY tn.ID

如何将查询连接在一起并输出下一个要使用的 TEST ID?

非常感谢任何帮助。

【问题讨论】:

  • 这与您提出的上一个问题有何不同? stackoverflow.com/questions/23917976/…
  • 嗨@Strawberry - 这个更具体,希望更清晰
  • 不。只需删除这个,澄清旧的,然后添加评论(所以,在 cmets 部分)只是提到这就是你所做的。
  • 我想说你的数据模型会让你的生活变得困难。在多用户系统中预测下一个 ID 将很难正常工作。更好的方法是等到您需要创建下一个测试尝试,然后在事务块中获取为您创建的 id。或者,如果您需要无缝 ids 在事务块中自己增加它。在您的方法中,多个用户可能将 id 4 作为 net id,这应该是不可能的。假设 id 也是你的 PK。

标签: mysql sequence next


【解决方案1】:
SELECT TEST_TYPE, COUNT(*) AS NUM_TESTS, COUNT(TEST_ID) AS NUM_TAKEN, (
        SELECT MIN(tn.ID)
        FROM TESTS tn
        LEFT JOIN TESTS_ATTEMPTED ta ON tn.ID = ta.TEST_ID
            AND ta.USER_ID = 2
        WHERE otn.TEST_TYPE = tn.TEST_TYPE
            AND ta.USER_ID IS NULL
        GROUP BY TEST_TYPE
        ) AS NEXT_TEST_ID
FROM TESTS otn
LEFT JOIN TESTS_ATTEMPTED ota ON otn.ID = ota.TEST_ID
    AND ota.USER_ID = 2
GROUP BY TEST_TYPE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 2021-12-17
    • 2017-04-13
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多