我目前正在一个足球网站上工作,而我正在开发的一项功能可追溯到历史,看看哪些球员每年得分最多。
我有一个有效的解决方案,但我认为会有一种更简单有效的方法。
以下是一些示例数据:
-----------------------
year | name | goals
-----------------------
1 | player1 | 6
1 | player2 | 8
1 | player3 | 4
2 | player1 | 3
2 | player2 | 5
2 | player3 | 2
3 | player1 | 7
3 | player2 | 7
3 | player3 | 3
使用以下查询,我可以检索我需要的部分数据。
SELECT
year
,MAX(goals
)ASgoals
FROMtable
GROUP BY`年
------------
year | goals
------------
1 | 8
2 | 5
3 | 7
从name
列中检索正确的值会更加困难,因为在第3年等多个GROUP_CONCAT
等实例的情况下我必须使用name
等于goals
的最大值。
目前,我正在使用两个查询来获得我想要的结果。我仍在使用上面的查询,但之后使用PHP while循环逐个搜索每年。
这是我的代码:
$load_goals = $db->query("SELECT `year`, MAX(`goals`) AS `goals` FROM `table` GROUP BY `year` DESC);
while($goals = $load_goals->fetchObject())
{
$players = $db->prepare("SELECT `year`, GROUP_CONCAT(`name` ORDER BY `name`) AS `name`, `goals` FROM `table` WHERE `year` = :year AND `goals` = :goals");
}
我已经尝试将两个查询合并为一个但无济于事,因此我们非常感谢您的任何指导。
澄清一下,这应该是我的最终结果。请注意第3年会发生什么,其中GROUP_CONCAT
已投放。
------------------------------
year | name | goals
------------------------------
1 | player2 | 8
2 | player2 | 5
3 | player1,player2 | 7
答案 0 :(得分:1)
所以你想要所有拥有最多进球数的球员。一种方法使用变量。另一个需要子查询。以下使用相关子查询,但有几种方法可以写这个:
public boolean deleteRowData(String tableName, String selection, String[] selectionArgs) {
open();
sqLiteDb.delete(tableName, selection, selectionArgs);
close();
return true;
}
// ---opens the database---
public NotesData open() throws SQLException {
DatabaseHelper dbHelper = new DatabaseHelper(context);
sqLiteDb = dbHelper.getWritableDatabase();
sqLiteDb = dbHelper.getReadableDatabase();
if (!sqLiteDb.isReadOnly()) {
// Enable foreign key constraints
sqLiteDb.execSQL("PRAGMA foreign_keys = ON;");
}
return this;
}
// ---closes the database---
public void close() {
if (sqLiteDb != null && sqLiteDb.isOpen()) {
sqLiteDb.close();
}
}
答案 1 :(得分:0)
只需将初始查询加入原始表:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showDeleteAlertDialog(position); // Common method for delete alert dialog
}
});
private void showDeleteAlertDialog(int arrayPosition) {
//delete data from
String title = getResources().getString(R.string.warning);
String message = getResources().getString(R.string.warning_for_delete);
final android.app.Dialog dialog = new Dialog(YourActivity.this, R.style.DialogTheme); //this is a reference to the style above
dialog.setContentView(R.layout.custom_dialog); //I saved the xml file above as custom_dialog.xml
dialog.setCancelable(true);
//to set the message
TextView sub_message = (TextView) dialog.findViewById(R.id.tv_Message);
TextView dialogTitle = (TextView) dialog.findViewById(R.id.tv_Title);
Button btn_Negative = (Button) dialog.findViewById(R.id.btn_Negative);
Button btn_Positive = (Button) dialog.findViewById(R.id.btn_Positive);
btn_Negative.setText("Cancel");
btn_Positive.setText("Delete");
sub_message.setText("Are you sure you want to delete this>");
dialogTitle.setText(title);
//add some action to the buttons
btn_Positive.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final String selection = YourColumnName + " LIKE ?";
final String[] selectionArgs = {myArrayList.get(arrayPosition).getID()};
mHelper.deleteRowData(YourTableNAME, selection, selectionArgs);
// Now just remove that array position from your arraylist (from activity & adapter arralist too).
myArrayList.remove(arrayPosition);
yourAdapter.yourArrayList.remove(arrayPosition);
notifyDataSetChanged();
}
});
btn_Negative.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
使用这种方法,多年来会有多个记录,其中有多个玩家并列最多目标。例如,如果您针对样本数据集运行此查询,则玩家1和2将同时出现在第3年,每个玩家都有7个目标。