ORDER BY MAX(`field_name`)使用GROUP BY

时间:2017-01-03 01:39:37

标签: php mysql

我目前正在一个足球网站上工作,而我正在开发的一项功能可追溯到历史,看看哪些球员每年得分最多。

我有一个有效的解决方案,但我认为会有一种更简单有效的方法。

以下是一些示例数据:

-----------------------
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)AS goals FROM table 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

2 个答案:

答案 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个目标。