Diskuze: Dotaz databáze
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Přidáš jen na konec dotazu
ORDER BY s.Datum DESC
LIMIT 1
Nevím co myslíš tím nejvyšším datumem, s limitem ti to vrátí pouze jednu s tím nejvyšším datumem, bez něj seřazené od nejnovější po nejstarší.
Jedná se o sklad, kde každá změna u položky skladu se ukládá jako nový záznam. Po načtení databáze do gridu potřebuji zobrazit všechny položky skladu s nejvyšším datem. Asi bude problém s tím, že mi to načte jen tu položku, kde je nejvyšší datum. V podstatě potřebuji u každé položky načíst tu s poslední změnou.
Dej mi příklad, asi nechápu, co jsou všechny položky s nejvyšším
datem
Ve skladu jsou např. Cihla, Cement, Vápno.
23.6.2012 Cihla cena 5,-
23.6.2012 Vápno cena 140,-
23.6.2012 Cement cena 135,-
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-
Potřebuji načíst
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-
Prostě poslední změny u všech položek
SELECT id, name, price, max(date)
FROM `devbook_obchod`
GROUP BY name
Doplň si tam ten join a je to hotové
Na vyzkoušení jsem si udělal dvě tabulky, napsal jsem to takto:
string connectionString = @"Data Source=MyDatabase.sdf";
using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
{
spojeni.Open();
string dotaz = "SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id ";
using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
using (DataSet vysledky = new DataSet())
{
adapter.Fill(vysledky);
foreach (DataRow radek in vysledky.Tables[0].Rows)
{
dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"], radek["Barva"], radek["datum"] );
}
}
spojeni.Close();
}
ale vyhazuje mi to chybu: In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions. [ Select clause = a,Clovek ]
Dělám to jako CE databázi
Nikdy jsem v CE nedělal, tady už bohužel neporadím.
Když používáš agregační funkce (sum, max, avg, ...) tak musíš dát všechny ostatní sloupce do klauzule group by.
Možná se mi to podařilo složitě, alu funguje mi to. Mám to takto:
string connectionString = @"Data Source=MyDatabase.sdf";
using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
{
spojeni.Open();
string dotaz = "SELECT l.Id, l.BarvaId, l.Clovek, l.Datum, b.Id, b.Barva FROM Lidi l LEFT JOIN Barvy b ON l.BarvaId = b.Id JOIN (SELECT Clovek, max(Datum) Datum FROM Lidi GROUP BY Clovek) k2 ON l.Clovek=k2.Clovek AND l.Datum=k2.Datum ";
using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
using (DataSet vysledky = new DataSet())
{
adapter.Fill(vysledky);
foreach (DataRow radek in vysledky.Tables[0].Rows)
{
dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"],radek["Barva"], radek["Datum"]);
}
}
spojeni.Close();
}
Funguje to, ale nevím zda je to optimální řešení
"SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id, a.Clovek, a.BarvaId, b.Id, b.Barva";
Zobrazeno 14 zpráv z 14.