通过比较特定列来查找最小值,但显示所有列和行 - MySQL

时间:2016-10-27 08:31:33

标签: mysql sql duplicates

我想通过比较特定列找到最小值,但显示所有列和行。我希望这个例子能让它更加清晰。

这是我的数据:

switchButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case ACTION_DOWN:
                    if (!switchButton.isChecked()) {
                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                ActivityLogin.this);

                        alertDialogBuilder
                                .setMessage(
                                        "Sure you want to enable?. ")
                                .setCancelable(true)
                                .setPositiveButton("YES",
                                        new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog,
                                                                int which) {
                                                dialog.cancel();
                                                switchButton.performClick();
                                            }
                                        })

                                .setNegativeButton(
                                        "NO",
                                        new DialogInterface.OnClickListener() {

                                            @Override
                                            public void onClick(DialogInterface dialog,
                                                                int which) {

                                                dialog.cancel();
                                            }
                                        });

                        AlertDialog alertDialog = alertDialogBuilder.create();
                        alertDialog.show();
                        return true;
                    } else{
                        // show dialog Sure you want to disable? and handle the button events accordingly
                    }
            }
            return false;
        }
    });

现在,我通过比较每一行的A和B列(重复)来寻找PK(Min_PK)的最小值。结果应如下所示:

import {Component, NgModule } from '@angular/core';

@Component({
  selector: 'test-app',
  template: `
    <label for="options">Options :</label>
    <div *ngFor="let cbItem of cbArr">
      <label>
        <input type="checkbox"
               name="options"
               value="{{cbItem}}"
               [checked]="cbChecked.indexOf(cbItem) >= 0"
               (change)="updateCheckedOptions(cbItem, $event)"/>
        {{cbItem}}
      </label>
    </div>
    <button (click)="updateOptions()">Post</button>
  `
})
export class TestComponent{
    cbArr: string[];
    cbChecked: string[];
  constructor() {
    this.cbArr = ['OptionA', 'OptionB', 'OptionC'];
    this.cbChecked = ['OptionB'];
  }
  
  updateCheckedOptions(chBox, event) {
      var cbIdx = this.cbChecked.indexOf(chBox);
      if(event.target.checked) {
          if(cbIdx < 0 )
            this.cbChecked.push(chBox);
      } else {
          if(cbIdx >= 0 )
            this.cbChecked.splice(cbIdx,1);
      }
  }
  
  updateOptions() {
    console.log(this.cbChecked);
  }
  
}

我尝试了几件事:

+----+----+-----+-----+
| PK | FK |  A  |  B  |
+----+----+-----+-----+
|  1 |  1 | abc | tzu |
|  2 |  1 | def | qwe |
|  3 |  2 | abc | tzu |
|  4 |  2 | def | qwe |
|  5 |  3 | def | qwe |
+----+----+-----+-----+

这只返回重复项,但不是所有列和行。如果我将PK和FK添加到GROUP BY,它将比较重复项的所有列。

这越来越近了:

+--------+----+----+-----+-----+
| Min_PK | PK | FK |  A  |  B  |
+--------+----+----+-----+-----+
|      1 |  1 |  1 | abc | tzu |
|      2 |  2 |  1 | def | qwe |
|      1 |  3 |  2 | abc | tzu |
|      2 |  4 |  2 | def | qwe |
|      2 |  5 |  3 | def | qwe |
+--------+----+----+-----+-----+

这里我有我想要的所有信息,但它不是正确的形式。我希望它按行分隔。 你能帮我解决这个问题吗?

--------------------------------------- 编辑:

Giorgos Betsos的代码正在研究这个问题,但对于大表来说,它的性能很差。这就是我想添加更多信息的原因。

在我的情况下,我想将代码用于包含 20列 500k行的大型表格。

如果我使用:

SELECT MIN(PK) AS Min_PK, `table`.`A`, `table`.`B`
FROM `test`.`table`
GROUP BY `table`.`A`, `table`.`B`;
+--------+-----+-----+
| Min_PK |  A  |  B  |
+--------+-----+-----+
|      1 | abc | tzu |
|      2 | def | qwe |
+--------+-----+-----+

超级快。获取所有信息只需几秒钟。但不幸的是,形式错误。

如果我使用Giorgos Betsos的代码:

SELECT
    MIN(PK) AS Min_PK,
    GROUP_CONCAT(`table`.`PK`),
    GROUP_CONCAT(`table`.`FK`),
    `table`.`A`,
    `table`.`B`
FROM `test`.`table`
GROUP BY
    `table`.`A`,
    `table`.`B`;
+--------+----------------------------+----------------------------+-----+-----+
| Min_PK | GROUP_CONCAT(`table`.`PK`) | GROUP_CONCAT(`table`.`FK`) |  A  |  B  |
+--------+----------------------------+----------------------------+-----+-----+
|      1 |                        1,3 |                        1,2 | abc | tzu |
|      2 |                      2,4,5 |                      1,2,3 | def | qwe |
+--------+----------------------------+----------------------------+-----+-----+

这是正确的形式和结果,但由于子查询+ 20 JOINS需要花费很多时间....

另一个问题是某些列中有NULL值,因此JOIN不起作用....

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以将第一个查询用作派生表并连接回原始表,以便获取其余字段:

Range("H16").Value = "Select distinct(description), merchant_name from(" & vbCrLf & "select distinct description, merchant_name from table_phase" & Range("G3").Value
Range("H16").Value = Range("H16").Value & vbCrLf & patternString & vbCrLf & "Union all" & vbCrLf
Range("H16").Value = Range("H16").Value & "select distinct description, merchant_name from table_phase" & Range("G4").Value
Range("H16").Value = Range("H16").Value & vbCrLf & patternString & vbCrLf & ") order by merchant_name, description"
Range("H16").Value = Trim(Range("H16").Value)
Range("H16").WrapText = True

Range("J16").Value = Replace(Range("H16").Value, vbCrLf, " ")
Range("J16").Copy