Arka arkaya büyük değeri mySQL?

6 Cevap php

PHP ile MySQL kullanıyorum. Bu benim masada gibi: (I 3 değerleri kullanıyorum, ama daha vardır)

id | 1 | 2 | 3
---+---+---+----
1  | 3 |12 |-29
2  | 5 |8  |8
3  | 99|7  |NULL

Belirli bir satırda en büyük değerin sütun adını almak gerekiyor. Bu almalısınız:

id | maxcol
---+-------
1  |   2
2  |   2
3  |   1

Bunu herhangi bir sorgu var mı? Ben çalışıyorum, ama doğru çalışması için alınamıyor.

6 Cevap

Bu normalleşme sorgu tasarım kolay yapmanıza yardımcı olur şekilde büyük bir örnektir. First Normal Form, başka bir tablo oluşturacak kadar tüm değerlerin ayrı ayrı satırlarda, bir sütunda olacaktır.

Eğer üç sütun genelinde değerlerini saklamak için repeating groups kullanmış olduğundan, büyük değeri ile sütunu bu şekilde bulabilirsiniz:

SELECT id, IF(col1>col2 AND col1>col3, 'col1', IF(col2>col3, 'col2', 'col3')) 
  AS column_with_greatest_value
FROM mytable;

Kısa cevap, bir sorgu ile bunu yapmak için basit bir araç var olmasıdır. Eğer veri aktarılması ve daha sonra büyük değeri bu şekilde belirlemek gerekir. Yani bir şey gibi:

Select Id, ColumnName, Value
From    (
        Select '1' As ColumnName, Id, [1] As Value
        From Table
        Union All
        Select '2', Id, [2]
        From Table
        Union All
        Select '3', Id, [3]
        From Table
        ) As Z
Where Exists(
            Select 1
            From    (
                    Select '1' As ColumnName, Id, [1] As Value
                    From Table
                    Union All
                    Select '2', Id, [2]
                    From Table
                    Union All
                    Select '3', Id, [3]
                    From Table
                    ) As Z2
            Where Z2.Id = Z.Id
            Group By Z2.Id
            Having Max(Z2.Value) = Z.Value
            )
Order By Id

Bu çözüm temelde BİRLİĞİ TÜM sorguları sütunları isim sütunları sabit bir dizi bağlıdır. Eğer aynı id için aynı değerlere sahip iki sütun varsa ek olarak, yinelenen satırları alırsınız.

Bu sorgu ne olursa olsun Tümceyi max değeri dönecektir

SELECT MAX(value)
FROM
(SELECT 1 column_no, col1 value
FROM anotherunamedtable
UNION ALL
SELECT 2, col2
FROM anotherunamedtable
UNION ALL
SELECT 3, col3
FROM anotherunamedtable) t

Eğer gerçekten sütun sayısını gerekiyorsa

SELECT id,
       (SELECT column_no
       FROM
              (SELECT 1 column_no, col1 value
              FROM anotherunamedtable
              WHERE id = t.id
              UNION ALL
              SELECT 2, col2
              FROM anotherunamedtable
              WHERE id = t.id
              UNION ALL
              SELECT 3, col3
              FROM anotherunamedtable
              WHERE id = t.id) s
        ORDER BY max_value DESC
        LIMIT 1)) as column_no
FROM anotherunamedtable t

But I think that the last query might perform exceptionally horrible. (Queries are untested)

Php tarafında, böyle bir şey yapabilirsiniz:

foreach ($rows as $key => $row) {
  $bestCol = $best = -99999;
  foreach ($row as $col => $value) {
    if ($col == 'id') continue; // skip ID column
    if ($value > $best) {
      $bestcol = $col;
      $best = $value;
    }
  }
  $rows[$key]['best'] = $bestCol;
}

Ya da benzer bir şey ...

Ormanlar ve ağaçlar, burada (ben bozmak vermedi sağlayan) önemsiz ve fastest çözüm; ifadesi sadece satırda büyük sütununda arar

SELECT id,
       CASE COALESCE(col1, -2147483648) >= COALESCE(col2, -2147483648)
       WHEN 
           CASE COALESCE(col2, -2147483648) >= COALESCE(col3, -2147483648)
           WHEN true THEN 1
           ELSE 
                CASE COALESCE(col1, -2147483648) >= COALESCE(col3, -2147483648)
                WHEN true THEN 1
                ELSE 3
                END 
           END 
       ELSE 
           CASE COALESCE(col2, -2147483648) >= COALESCE(col3, -2147483648)
           WHEN true 2
           ELSE 3
           END 
       END 
FROM table t

a version with IF() would maybe be more readable, but the above should perform a bit better To deal with NULLS an INT value with minimum of -2147483648 was assumed, the expression could be rewritten to deal explicitly with nulls but would have to branch into 8 different cases and is left as an exercise for the OP.