Soru Tarih ve saat TARAFINDAN SİPARİŞ YAPIN


bunun gibi bir tablom var:

name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00:01:01

önce en eski ismi istiyorum:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

(-> çalışmıyor!)

şimdi bana ilk deli vermeli (daha erken bir tarihe sahip) sonra tom

fakat GROUP BY name ORDER BY date ASC, time ASC bana daha yeni çılgınlık veriyor çünkü önce bu gruplardan önce gruplar!

Yine: Sorun şu ki, GROUP BY önce ORDER BY olmalıdır çünkü gruptan önce tarih ve saat göre sıralayamıyorum!


44
2017-07-04 13:21


Menşei


grup tarafından toplama için değil, toplama işlevleri ile kullanılır - bu hakkın olduğundan emin misiniz? - Neville Kuyt
daha iyi bir fikrin var mı? Farklı düşündüm ama sonra tarih ve zaman farklı. - CodingYourLife
Tarih ve saat sütunlarını birleştirmenin bir yolu olsaydı, aslında sadece isim ve en erken her isim için tarihsaat değeri? - Damien_The_Unbeliever
sonuç olmalıdır: deli | 2009-06-03 | 00:01:01 / \ tom | 2011-07-04 | 01:09:52 - CodingYourLife
Seçiminiz bir toplama işlevine sahip değildir, bu nedenle "grupla" hiçbir şey yapmaz. Akrep'in cevabı işe yaramalı ... - Neville Kuyt


Cevaplar:


Diğer yöntem:

SELECT * 
FROM (
    SELECT * 
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

GROUP BY, eşleşen ilk sonuçtaki gruplara hitap eder. İlk eşleşen isabet istediğin gibi olursa, herşey beklendiği gibi çalışmalı.

Bu yöntemi, alt sorgunun diğer koşullarla birlikte karalamak yerine mantıklı bir anlam kazandıracağı gibi tercih ederim.


63
2017-12-17 00:20



Bu yaklaşımın maalesef MariaDB üzerinde çalışmadığına dikkat edin (MariaDB, MySQL için bir drop-in değiştirme olarak kabul edilir): mariadb.com/kb/en/mariadb/... - rinogo
Alt sorguda eksik bir FROM var gibi görünüyor. - John Reid
Alt sorgu büyük bir set döndürürse, bu büyük veri kümeleriyle gerçekten yavaş oluyor. - Nimeshka Srimal
Onun db ile woking değil. mysql kullanıyorum 5.7.17 - Sudhanshu Jain
Alt sorguya "LIMIT 18446744073709551615" eklenmesi, MariaDB üzerinde bir şeyler düzeltmelidir, ancak bu kirli bir çözümdür :) - gnysek


Bence aradığın şey bu:

SELECT name, min(date)
FROM myTable
GROUP BY name
ORDER BY min(date)

Bu süre için STR_TO_DATE tarihinde bir mysql tarihi yapmanız gerekiyor:

STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')

Yani :

SELECT name, min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
FROM myTable
GROUP BY name
ORDER BY min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))

26
2017-07-04 13:39



Bunun gerçekten benim sorunumun cevabı olup olmadığını bilmiyorum. Zamanla doğru bir şekilde sıralama görünmüyor. Buradaki sözdiziminin doğru olup olmadığını kontrol edebilir misiniz: ($ sql = 'SELECT * table group by name from name;;) $ sql. = "min. order" min (STR_TO_DATE (orderDate +' '+ orderTime,'% m /% d) /% Y% h:% i:% s ')) "; - CodingYourLife
Gruplandırıyorsanız, bir 'SELECT *' gerçekleştiremezsiniz. Sorgunuzun SELECT bölümünü değiştirin. - Cyril Gandon
tamam ve şimdi nasıl $ row ["date"] söyleyebilirim? doğru şekilde sıralanmıyor ... sadece tarih için NULL ve sipariş sıralanmadı diyor. - CodingYourLife
Bir hata yaptım, ihtiyacınız olan% m /% d /% Y değil,% Y -% m -% d. Sorguyu güncelledim. - Cyril Gandon
Bunun işe yaradığını sanmıyorum. İade edilen isim sütununun tarihle aynı satırda olması konusunda bir güvence yoktur. Eğer bu problemi çözmüş gibi görünüyorsa, muhtemelen kararsız olandan daha fazla olduğunu unutmayın. - Rob Forrest


Kullanıcı1908688'nin cevabı hakkında yorum yapma iznim olmadığı için, burada MariaDB kullanıcıları için bir ipucu:

SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name

https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-from-subquery-ignored/


15
2018-02-04 13:48



Bu tam olarak aradığım çözüm. Kaynak için teşekkürler! - naurel
Bu ne kadar hacky, ama MariaDB üzerinde çalışmak için bunu elde etmek için tek yol gibi görünüyor. - rinogo
yaklaşık iki saat keşfettikten sonra, çalışan çözümdür. - kamran


Bu benim için çalıştı:

SELECT *
FROM your_table
WHERE id IN (
    SELECT MAX(id)
    FROM your_table
    GROUP BY name
);

7
2018-02-10 16:44





Bir alt seçim kullanın:

select name, date, time
from mytable main
where date + time = (select min(date + time) from mytable where name = main.mytable)
order by date + time;

3
2017-07-04 13:34





Sadece bir bekar olduğum bu soruda farklı bir varyasyonum vardı. DATETIME alan ve gerekli bir limit sonra group by veya distinct dayalı olarak inen sıralama göre datetime Saha, ama bu bana yardımcı oldu:

select distinct (column) from
(select column from database.table
order by date_column DESC) as hist limit 10

Bu örnekte bölünmüş alanlar ile, bir yarışmada sıralayabilirsiniz, o zaman şöyle bir şey ile kurtulmak mümkün olabilir:

select name,date,time from
(select name from table order by concat(date,' ',time) ASC)
as sorted

Daha sonra sınırlamak isterseniz, limit ifadenizi sonuna ekleyeceksiniz:

select name,date,time from
(select name from table order by concat(date,' ',time) ASC)
as sorted limit 10

0
2017-07-21 20:06





Bu tam bir cevap değil, fakat bu durum, mysql ile gruptan önce sıra sırasını sipariş etme yaklaşımıyla bazı problemleri çözmek isteyen insanlar için yararlı olabilir.

En son satırı bulmak istediğimde bu konuya geldim. order by date desc ancak belirli bir sütun türü için tek bir sonuç elde edersiniz. group by column name).

Bu sorunu çözmek için başka bir yaklaşım yapmaktır toplama kullanımı.

Yani, sorguyu her zamanki gibi çalıştırabiliriz. sıralanmış asc ve yeni alanı tanıtın max(doc) as latest_docAynı sütuna göre gruplandırılmış en son tarihi verecektir.

Şimdi, belirli bir sütunun verilerini bulmak istediğinizi varsayalım ve maksimum toplama yapılamaz. Genel olarak, belirli bir sütunun verilerini bulmak için, GROUP_CONCAT aggregatorBu sütunda bulunamayan bazı benzersiz ayırıcılarla GROUP_CONCAT(string SEPARATOR ' ') as new_columnve siz buna erişirken, new_column alanını bölebilir / patlatabilirsiniz.

Yine, bu herkes için geçerli olmayabilir. Bunu yaptım ve çok beğendim çünkü birkaç işlev yazdım ve alt sorguları çalıştıramadım. Php için codeigniter framework üzerinde çalışıyorum.

Karmaşıklıktan da emin değilim, birisi bunun üzerine biraz ışık tutabilir.

Saygılarımızla :)


0
2018-05-17 07:55



Sanırım burada alt sorgudan kaçtım ve işler dakika değişiklikleriyle sadece bir sorguda işe yarayabilirdi. Bir şeyi özleyeceksem lütfen düzeltin, tekrar teşekkürler! - Satys