【问题标题】:How to take values of joined tables with same column name?如何获取具有相同列名的连接表的值?
【发布时间】:2013-08-11 08:06:49
【问题描述】:

MainActivity.java:

    private void displayListView() {
    cursor = myDatabase.getJoinedInfo(etSearch.getText().toString());

    String[] columns = new String[] { myDatabase.RE_VALUE,
            myDatabase.GL_VALUE, myDatabase.KE_VALUE };

    int[] to = new int[] { R.id.tvHiragana, R.id.tvMeaning, R.id.tvKanji };

    dataAdapter = new SimpleCursorAdapter(this, R.layout.wordonlist,
            cursor, columns, to, 0);

    ListView listView = (ListView) findViewById(R.id.lvWordlist);
    // Assign adapter to ListView

    listView.setAdapter(dataAdapter);
}

MyDatabase.java:

public static final String GL_TABLE="gloss";
public static final String GL_ID="id";
public static final String GL_LANG="lang";
public static final String GL_VALUE="value";

public static final String KE_ID="id";
public static final String KE_VALUE="value";

public static final String RE_ID="id";
public static final String RE_VALUE="value";

public static final String LOG_TAG="myLogs";

public Cursor getJoinedInfo(String lookingFor)
{
    Log.d(LOG_TAG, "DB: looking up info");

    SQLiteDatabase db=getReadableDatabase();

    Cursor cursor;
    String query;

    query="SELECT " +
            " e.id AS _id," +
            " ke.id AS _id," +
            " ke.fk," +
            " ke.value," +
            " re.id AS _id," +
            " re.fk," +
            " re.value," +
            " s.id AS _id," +
            " s.fk," +
            " g.id AS _id," +
            " g.fk," +
            " g.lang," +
            " g.value" +
            " FROM entry e" +
            "     INNER JOIN k_ele ke ON e.id = ke.fk" +
            "     INNER JOIN r_ele re ON e.id = re.fk" +
            "     INNER JOIN sense s ON e.id = s.fk" +
            "     INNER JOIN gloss g ON s.id = g.fk" +
            " WHERE g.value like '%"+lookingFor+"%' LIMIT 20";

    Log.d(LOG_TAG, "DB: query = \n" + query.replace(", ",",\n  "));
    cursor=db.rawQuery(query,null);
    Log.d(LOG_TAG, "DB: query complete");

    return cursor;      
}

我有 5 张桌子。其中 3 个具有名称为“值”的列。光标只取一个表的“值”而忽略其他表。并且与搜索字符串匹配的所有值都是相似的!请给一些关于如何解决这个问题的建议。

【问题讨论】:

  • 您找到任何解决方案了吗?

标签: android sql sqlite join


【解决方案1】:

AS 关键字的全部意义在于为列分配另一个名称,该名称在所有检索到的列中是唯一的。您只在其中一些上使用它,并且始终分配相同的列名。查询应该是这样的

query = "SELECT " +
        " e.id AS e_id," +
        " ke.id AS ke_id," +
        " ke.fk as ke_fk," +
        " ke.value as ke_value," +
        " re.id AS re_id," +
        " re.fk as re_fk," +
        " re.value as re_value," +
        " s.id AS s_id," +
        " s.fk as s_fk," +
        " g.id AS g_id," +
        " g.fk as g_fk," +
        " g.lang," +
        " g.value as g_lang" +
        " FROM entry e" +
        "     INNER JOIN k_ele ke ON e.id = ke.fk" +
        "     INNER JOIN r_ele re ON e.id = re.fk" +
        "     INNER JOIN sense s ON e.id = s.fk" +
        "     INNER JOIN gloss g ON s.id = g.fk" +
        " WHERE g.value like '%"+lookingFor+"%' LIMIT 20";

这样,结果集中的每一列都会有不同的名称。您还应该改进您的命名,因为像 g、s、e、ke 和 re 这样的名称没有任何意义,并且会使代码难以阅读和理解。

【讨论】:

  • 非常感谢。代码不起作用,但我理解了 AS 的一般含义并实现了。我可以再问一个问题吗?如何避免已连接表中的值重复?例如,当我搜索“女孩”时,由于重复而给出 5 个结果(它有 5 种书写方式)。如何使光标只给出一个结果? PS。您可以在屏幕截图中看到它。一种意思,不同的写法(汉字)
  • 您好,我已经在 2 个表中应用了 InnerJoin,第一个表中的主键列在第二个表中是外键。第二个表有 3 行与我设法进行 rawquery 的外键关联,但不知道如何读取游标,比如说在一个查询中从第一个表中获取 1 行,从第二个表中获取 3 行。
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多