首页 > 解决方案 > 无法从 JOINed 表中获取正确的信息

问题描述

应用程序应该做什么

该应用程序是一个测验应用程序,选择 4 个可能的答案(只有 1 个是正确的),具有多个难度级别和多个问题类别。

我有一张有问题的表格,一张有答案的表格,还有一张难度级别的表格,我和一个我不再联系的人共同开发了这些表格(他做了 SQL 和数据库工作,这就是我为什么挣扎)。有几种测验模式,但对于这个问题,让我们专注于“标准”测验模式(例如,简单、中等、困难,它根据难度级别加载问题,并且效果很好)和“自定义”模式(其中一个或多个类别由用户在测验开始之前选择,这不起作用)。

获得标准测验模式答案的工作代码如下 - 再次,这有效:

                cursor = getReadableDatabase().rawQuery(
                    String.format(
                            "SELECT a.%s %s, question_id, a.text text, is_correct " +
                                    "FROM %s a JOIN %s q ON a.question_id = q.%s " +
                                    "JOIN %s l ON q.level_id = l.%s WHERE l.level = ? AND q.is_active = 1",
                            BaseColumns._ID, BaseColumns._ID,
                            ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID,
                            LEVELS_TABLE_NAME, BaseColumns._ID
                    ),
                    new String[]{Integer.toString(level)}

我的问题

下面是获取自定义测验模式答案的代码。假设用户选择测验类别“历史”和“技术”(或者甚至只是其中一个类别)。当我运行这个特定的查询时,测验加载正常,但没有显示答案:

        cursor = getReadableDatabase().rawQuery(
                String.format(
                        "SELECT a.%s %s, question_id, a.text text, is_correct " +
                                "FROM %s a JOIN %s q ON a.question_id = q.%s WHERE q.category = ? AND q.is_active = 1 ",
                        BaseColumns._ID, BaseColumns._ID,
                        ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
                ),
                new String[]{thisQuestionCategory});

更多信息

我很高兴发布有关数据库或应用程序的任何信息(表、列名、Java 代码等,请直接询问 - 我不想立即将它们全部转储到这里)。

数据库/表信息

根据要求,有关表格的一些信息:

表列表

问题表中的一次项目

答案表中的一项

最后

我知道我的其余代码可能存在缺陷导致此问题,但 SQL 查询似乎是最好的起点,因为它是我最不熟悉的领域。我已经检查了其余代码的逻辑并没有发现任何问题,但是如果我们无法发现 SQL 的任何问题,我可以发布 Java 代码,以便您了解应用程序是如何组合在一起的。感谢您的时间。

标签: javaandroidsqlandroid-sqlite

解决方案


考虑以下示例表:-

在此处输入图像描述

在此处输入图像描述

  • 请注意,id列已命名为_id以反映Base.Columns._ID解析为的值(即 _id 不是 id 根据您的屏幕截图)。

并且您的 SQL 将解析为(假设通过 thisQuestionCategory 传递的类别是HISTORY):-

SELECT a._id _id, question_id, a.text text, is_correct 
FROM quiz_answers a
JOIN quiz_questions q ON a.question_id = q._id 
WHERE q.category = 'HISTORY' AND q.is_active = 1
;

那么结果将是:-

在此处输入图像描述

即在功能上,代码似乎没有任何问题。

您可以添加如下内容:-

Log.d("CURSORINFO",String.valueOf(cursor.getCount())+ " rows were extracted.");

然后运行并检查日志以查看提取了多少行。

  • 如果数字大于 0,那么您的问题在其他地方(稍后)。
  • 如果数字为 0,请尝试删除 where 子句(例如下面的代码)并重新运行。如果您仍然检索 0 行,那么很可能没有连接数据。即要包含一个答案,它必须引用一个问题。

        cursor = this.getReadableDatabase().rawQuery(
            String.format(
                    "SELECT a.%s %s, question_id, a.text text, is_correct " +
                            "FROM %s a JOIN %s q ON a.question_id = q.%s",
                    BaseColumns._ID, BaseColumns._ID,
                    ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
            ), null);
    

推荐阅读