gpt4 book ai didi

android - 加入多对一,但显示为一个结果

转载 作者:太空狗 更新时间:2023-10-29 14:39:26 25 4
gpt4 key购买 nike

我必须要加入 SQLite 中的表。一张表有练习的 ID 和标题。另一张表有该练习的图像。每个练习可以有很多图像。

我曾尝试使用 JOIN 编写 SQL,但每次练习它给我 2 行(因为每个练习至少有 100 张图像)。但是我希望它在一行中,因为我将在 Android Java 适配器中使用结果。

我将在下面发布我的表和我拥有的 SQL。我还将发布 Java 方法,以防使用 JOIN 以外的其他方法解决此问题。

运动指数:

╔════════════╦═══════════════╗
║ exercise_id║ exercise_title║
╠════════════╬═══════════════╣
║ 1 ║ Bench press ║
║ 2 ║ Sit ups ║
║ 3 ║ Push ups ║
╚════════════╩═══════════════╩

exercise_index_images:

╔═══════════════════╦═══════════════════════════╦════════════════════╗
║ exercise_image_id ║ exercise_image_exercise_id║ exercise_image_file║
╠═══════════════════╬═══════════════════════════╬════════════════════╣
║ 1 ║ 1 ║ bench_press_1.png ║
║ 2 ║ 1 ║ bench_press_2.png ║
║ 3 ║ 2 ║ sit_ups_1.png ║
║ 4 ║ 2 ║ sit_ups_2.png ║
║ 5 ║ 3 ║ push_ups_1.png ║
║ 6 ║ 3 ║ push_ups_2.png ║
╚═══════════════════╩═══════════════════════════╩════════════════════╩

我现在的查询:

String query = "SELECT exercise_index.exercise_id, exercise_index.exercise_title, " +
"exercise_index_images.exercise_image_id, exercise_index_images.exercise_image_file " +
"FROM exercise_index " +
"JOIN exercise_index_images ON exercise_index.exercise_id=exercise_index_images.exercise_image_exercise_id";

这给了我:

╔════════════╦═══════════════╗╔═══════════════════╦═══════════════════════════╦════════════════════╗
║ exercise_id║ exercise_title║║ exercise_image_id ║ exercise_image_exercise_id║ exercise_image_file║
╠════════════╬═══════════════╣╠═══════════════════╬═══════════════════════════╬════════════════════╣
║ 1 ║ Bench press ║║ 1 ║ 1 ║ bench_press_1.png ║
║ 1 ║ Bench press ║║ 2 ║ 1 ║ bench_press_2.png ║
║ 2 ║ Sit ups ║║ 3 ║ 2 ║ sit_ups_1.png ║
║ 2 ║ Sit ups ║║ 4 ║ 2 ║ sit_ups_2.png ║
║ 3 ║ Push ups ║║ 5 ║ 3 ║ push_ups_1.png ║
║ 3 ║ Push ups ║║ 6 ║ 3 ║ push_ups_2.png ║
╚════════════╩═══════════════╩╚═══════════════════╩═══════════════════════════╩════════════════════╩

我想要的是这个:

╔════════════╦═══════════════╗╔═════════════════════╦═════════════════════════════╦══════════════════════╗╔═════════════════════╦═════════════════════════════╦══════════════════════╗
║ exercise_id║ exercise_title║║ exercise_image_id_1 ║ exercise_image_exercise_id_1║ exercise_image_file_1║║ exercise_image_id_2 ║ exercise_image_exercise_id_2║ exercise_image_file_2║
╠════════════╬═══════════════╣╠═════════════════════╬═════════════════════════════╬══════════════════════╣╠═════════════════════╬═════════════════════════════╬══════════════════════╣
║ 1 ║ Bench press ║║ 1 ║ 1 ║ bench_press_1.png ║║ 2 ║ 1 ║ bench_press_2.png ║
║ 2 ║ Sit ups ║║ 3 ║ 2 ║ sit_ups_1.png ║║ 4 ║ 2 ║ sit_ups_2.png ║
║ 3 ║ Push ups ║║ 5 ║ 3 ║ push_ups_1.png ║║ 6 ║ 3 ║ push_ups_2.png ║
╚════════════╩═══════════════╩╚═════════════════════╩═════════════════════════════╩══════════════════════╩╚═════════════════════╩═════════════════════════════╩══════════════════════╩

Android/Java 方法:

public void populateExercises(){

/* Database */
DBAdapter db = new DBAdapter(this);
db.open();

// Get all food for that category
String currentLanguageSQL = db.quoteSmart(currentLanguage);
String query = "SELECT exercise_index._id, exercise_index.exercise_id, exercise_index.exercise_title, exercise_index.exercise_type_id " +
"FROM exercise_index " +
"WHERE exercise_language=" + currentLanguageSQL + " AND exercise_muscle_group_id_main=" + currentMuscleGroupMainId;
query = query + " ORDER BY exercise_title ASC";

listCursor = db.rawQuery(query);


// Find ListView to populate
ListView lvItems = findViewById(R.id.listViewExercises);

// Setup cursor adapter using cursor from last step
ExercisesCMuscleGroupsOpenMainCursorAdapter exercisesAdapter = new ExercisesCMuscleGroupsOpenMainCursorAdapter(this, listCursor);

// Attach cursor adapter to the ListView
try {
lvItems.setAdapter(exercisesAdapter); // uses ContinensCursorAdapter
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
}
// Close db
db.close();


// OnClick
lvItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
exerciseListItemClicked(arg2);
}
});


} // populateExercises

最佳答案

如果您只有两个图像,那么您可以进行条件聚合:

select exercise_id, exercise_title, 
max(case when seq = 1 then exercise_image_id end) as exercise_image_id_1,
max(case when seq = 1 then exercise_image_file end) as exercise_image_file_1,
max(case when seq = 2 then exercise_image_id end) as exercise_image_id_2,
max(case when seq = 2 then exercise_image_file end) as exercise_image_file_2
from (select *, row_number() over (partition by ei.exercise_id order by eimg.exercise_image_id) seq
from exercise_index ei inner join
exercise_index_images eimg
on eimg.exercise_image_exercise_id = ei.exercise_id
) t
group by exercise_id, exercise_title;

关于android - 加入多对一,但显示为一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50986357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com