2009-08-30 24 views
6

her grupta en son 5 seçilmesiSQL Sorgu, bu masayı var

CREATE TABLE `codes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`language_id` int(11) unsigned NOT NULL, 
`title` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

Dil_Kimliği kaydı. içinde ne dili ben yapmak istiyorum ne ifade eder en son beş listesini almak olduğunu (ORDER BY time_posted DESC LIMIT 5), her dil_id'da kaydını tutar. Bunu, PHP içinde bir dizi farklı SQL sorgusuyla yapabildim ama daha basit bir yol olduğunu hissediyorum.

SQL'de bir kitap almam gerekiyor haha.

Teşekkürler. İşte

+1

Ne SQL motoru? Bu ne yazık ki çok önemli - SQL Standart, PostgreSQL, MS SQL Server, Oracle, IBM DB2, vb, tam olarak ne istediğinizi yapmak için mükemmel bir yol var - ama MySQL ile sıkışmışsanız, bu mükemmel çözüm üzerinde çalışıyor her iyi ilişkisel DB ve standardın kendisine göre mevcut değildir, bu yüzden kudge-ve-kludge zamanı (MySQL için ders için eşittir). Öyleyse bu ne olacak? - gezegendeki her bir SQL uygulaması, bir tarafta mı, yoksa MySQL mi? –

+0

@Alex: Çalıların etrafında atmayı bırakın - MySQL hakkında ne hissettiğinizi bize bildirin! Şişelenmiş halde kalmayın. ;-) –

+0

mySQL> MS Erişimi ...zorlukla –

cevap

9

Ben MySQL sorgu bu "üst N grup başına" türü çözmek aşağıda açıklanmıştır:

SELECT c1.* 
FROM codes c1 
LEFT OUTER JOIN codes c2 
    ON (c1.language_id = c2.language_id AND c1.time_posted < c2.time_posted) 
GROUP BY c1.id 
HAVING COUNT(*) < 5; 

Ayrıca bkz "How do I select multiple items from each group in a mysql query?"

+0

Serseri olduğum için üzgünüm, ama C1 ve C2 nereden geldi? –

+0

Tablo takma adları –

+0

'time_posted' bağları varsa bazı ilginç sonuçlar alabilirsiniz unutmayın. Bu bir endişe olursa bana bildirin çünkü çözülebilir. –

-1

İşte ben sadece buldum harika bir çözüm.

için TOP n Satırları'nı seçin Her Grubu Arnie Rowland, 13 Mart 2008

Her Kategori için Çoklu Satırlar vardır ve Kategori başına SADECE ÜST iki (2) satırları seçmek için bir istek vardır Fiyat ile. aşağıdaki veriler Örneğin :

RowID Category ID Description  Price 
1  Pot   A1 Small Saucepan 21.50 
2  Pot   A2 1 Qt Saucepan 29.95 
3  Pot   A3 1.5 Qt Saucepan 33.95 
4  Pot   A4 Double Boiler 39.50 
5  Pot   A5 Stewpot   49.50 
6  Pot   A6 Pressure Cooker 79.95 
7  Pan   B1 8" Pie   6.95 
8  Pan   B2 8" Sq Cake  7.50 
9  Pan   B3 Bundt Cake  12.50 
10  Pan   B4 9x12 Brownie 7.95 
11  Bowl  C1 Lg Mixing  27.50 
12  Bowl  C2 Sm Mixing  17.50 
13  Tools  T1 14" Spatula  9.95 

istenen çıkış: istenen çıktı elde edilmesi için birkaç yöntem vardır

RowID Category ID Description  Price 
11  Bowl  C1 Lg Mixing  27.50 
12  Bowl  C2 Sm Mixing  17.50 
9  Pan   B3 Bundt Cake  12.50 
10  Pan   B4 9x12 Brownie 7.95 
6  Pot   A6 Pressure Cooker 79.95 
5  Pot   A5 Stewpot   49.50 
13  Tools  T1 14" Spatula  9.95 

. Bu gösteri SQL Server 2005/SQL Server 2008, ve sonra SQL Server için bir çözüm 2000

Hem Çözümleri

için örnek Verileri oluşturma
-- Suppress data loading messages 
SET NOCOUNT ON 

-- Create Sample Data using a Table Variable 
DECLARE @MyTable table 
    ( RowID   int IDENTITY, 
     Category  varchar(5), 
     [ID]   varchar(5), 
     [Description] varchar(25), 
     Price   decimal(10,2) 
    ) 

-- Load Sample Data 

INSERT INTO @MyTable VALUES ('Pot', 'A1', 'Small Saucepan', 21.50) 
INSERT INTO @MyTable VALUES ('Pot', 'A2', '1 Qt Saucepan', 29.95) 
INSERT INTO @MyTable VALUES ('Pot', 'A3', '1.5 Qt Saucepan', 33.95) 
INSERT INTO @MyTable VALUES ('Pot', 'A4', 'Double Boiler', 39.50) 
INSERT INTO @MyTable VALUES ('Pot', 'A5', 'Stewpot', 49.50) 
INSERT INTO @MyTable VALUES ('Pot', 'A6', 'Pressure Cooker', 79.95) 
INSERT INTO @MyTable VALUES ('Pan', 'B1', '8"" Pie', 6.95) 
INSERT INTO @MyTable VALUES ('Pan', 'B2', '8"" Sq Cake', 7.50) 
INSERT INTO @MyTable VALUES ('Pan', 'B3', 'Bundt Cake', 12.50) 
INSERT INTO @MyTable VALUES ('Pan', 'B4', '9x12 Brownie', 7.95) 
INSERT INTO @MyTable VALUES ('Bowl', 'C1', 'Lg Mixing', 27.50) 
INSERT INTO @MyTable VALUES ('Bowl', 'C2', 'Sm Mixing', 17.50) 
INSERT INTO @MyTable VALUES ('Tools', 'T1', '14"" Spatula', 9.95) 
Return to Top 

SQL Server 2005/SQL Server 2008 Çözüm için bir çözüm sağlar

--Query to Retrieve Desired Data 
SELECT 
    RowID, 
    Category, 
    [ID], 
    [Description], 
    Price 
FROM (SELECT 
     ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Price DESC) AS 'RowNumber', 
     RowID, 
     Category, 
     [ID], 
     [Description], 
     Price 
     FROM @MyTable 
    ) dt 
WHERE RowNumber <= 2 

-- Results 
RowID Category ID Description  Price 
11 Bowl  C1 Lg Mixing  27.50 
12 Bowl  C2 Sm Mixing  17.50 
9  Pan  B3 Bundt Cake  12.50 
10 Pan  B4 9x12 Brownie 7.95 
6  Pot  A6 Pressure Cooker 79.95 
5  Pot  A5 Stewpot   49.50 
13 Tools  T1 14" Spatula  9.95 
Return to Top 

bir CTE kullanılarak 2008 Çözüm (Ekleyen: Jacob Sebastian) SQL Server 2005/SQL Server

01 SQL
-- Define a CTE with the name "dt" 
;WITH dt AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Price DESC) AS 'RowNumber', 
     RowID, 
     Category, 
     [ID], 
     [Description], 
     Price 
     FROM @MyTable 
) 
-- and select the data from the CTE 
SELECT 
    RowID, 
    Category, 
    [ID], 
    [Description], 
    Price 
FROM dt 
WHERE RowNumber <= 2 

-- Results 
RowID Category ID Description  Price 
11 Bowl  C1 Lg Mixing  27.50 
12 Bowl  C2 Sm Mixing  17.50 
9  Pan  B3 Bundt Cake  12.50 
10 Pan  B4 9x12 Brownie 7.95 
6  Pot  A6 Pressure Cooker 79.95 
5  Pot  A5 Stewpot   49.50 
13 Tools  T1 14" Spatula  9.95 
Return to Top 

itibaren Çözüm

--Query to Retrieve Desired Data 
SELECT DISTINCT 
    RowID, 
    Category, 
    [ID], 
    [Description], 
    Price 
FROM @MyTable t1 
WHERE RowID IN (SELECT TOP 2 
        RowID 
       FROM @MyTable t2 
       WHERE t2.Category = t1.Category 
       ORDER BY Price DESC 
       ) 
ORDER BY 
    Category, 
    Price DESC 

-- Results 
RowID Category ID Description  Price 
11 Bowl  C1 Lg Mixing  27.50 
12 Bowl  C2 Sm Mixing  17.50 
9  Pan  B3 Bundt Cake  12.50 
10 Pan  B4 9x12 Brownie 7.95 
6  Pot  A6 Pressure Cooker 79.95 
5  Pot  A5 Stewpot   49.50 
13 Tools  T1 14" Spatula  9.95 

: Select the TOP n Rows For Each Group

+0

Sadece bağlantıya verilen cevapların kaldırıldığını unutmayın, SO cevapları bir çözüm arayışının son noktası olmalıdır. zaman içinde bayat eğilimi olan referansların terk edilmesi. Lütfen bağlantıyı referans olarak tutarak, burada tek başına bir özet eklemeyi düşünün. – kleopatra