webForumDet fria alternativet

Lurig SQL sats

Databaser & SQL

4 svar · 1 913 visningar · startad av saturday

Medlem sedan jan. 2007133 inlägg
Frågan#1

Hej!

Jag har ett bekymmer jag behöver hjälp med. Jag ska ta in butiksfakta för en butikskedja med deras anställda i en MySql databas. Arbetar med MySql (5.5.30-cll-lve) och PhpMyAdmin.

Jag har därför skapat en tabell som har alla fakta kring en person jag behöver och därefter en tabell som innehåller butiksnummer och antal anställda i den butiken.

Jag har skickat ett exel-fil till företaget som de ska fylla i. Se skärmdump nedan (som bara innehåller exempeldata just nu).

Fältet "madeit" i persontabellen innehåller "1" eller "0" beroende på om den anställde har uppfyllt en sak.

När jag gör om Exel-dokumentet till CSV och sedan importerar det till tabellerna ska de flesta värdena i persontabellen, men när det gäller storeid så ska varje storeid räknas (count) och stoppas in i butikstabellen med "storenum" en gång och count som "employees". Hur kan jag göra det?

För presentationen av datan behöver jag göra följande:
1 Plocka varje unikt storeid från persontabellen
2 Räkna hur många gånger varje storeid finns där ”madeit” är lika med 1.
3 Jämför det "count" med ”Employees”-numret i butikstabellen
4 Om det överensstämmer plocka upp det i loopen och skriv ut data i HTML(Php-scriptet har jag kontroll på)

Det är alltså SQL-strängarna jag är ute efter för import och presentation.

Någon som känner sig manad och sjukt vass på SQL och vill hjälpa mig med hur jag ska gå tillväga? Hojta till om något är oklart!

Ps. Är medveten om att "persontabellen" kan brytas ned till fler tabeller för att optimera ännu mer, men nu är det vad det är. :)

Vore oerhört tacksam för hjälp!

exeldata.pngbutikstabell.pngpersontabell.png
Medlem sedan jan. 2007133 inlägg
#2

Jag har lurat ut att denna sträng plockar ut och kollar hur många "madeit" det är per "storeid" från person/employees-tabellen:

SELECT storeid, count(madeit) FROM employees WHERE madeit = 1 GROUP BY storeid

Men nu behöver jag kolla om counten stämmer med fältet "employees" i butikstabellen och loopa ut dem som överensstämmer.

Medlem sedan aug. 20039 340 inlägg
#3
SELECT s.id as storeid, s.employees as employees, count(e.madeit) as madeitcount
FROM stores s
LEFT JOIN employees e ON e.storeid = s.id
WHERE e.madeit = 1 
GROUP BY s.id

Du vill nog inte filtrera ut vilka affärer som stämmer redan i frågan, men om du vill det måste du gör det med HAVING i denna fråga, eftersom det evalueras efter GROUP, till skillnad från WHERE. Frågan nedan bör ge dig alla affärer där värdet stämmer.

SELECT s.id as storeid, s.employees as employees, count(e.madeit) as madeitcount
FROM stores s
LEFT JOIN employees e ON e.storeid = s.id
WHERE e.madeit = 1 
GROUP BY s.id
HAVING s.employees = count(e.madeit)
Medlem sedan jan. 2007133 inlägg
#4

Fy tusan så vasst! Fungerade klockrent! DU(!) gjorde min dag. :)

nitro2k01 skrev:

SELECT s.id as storeid, s.employees as employees, count(e.madeit) as madeitcount
FROM stores s
LEFT JOIN employees e ON e.storeid = s.id
WHERE e.madeit = 1 
GROUP BY s.id

Du vill nog inte filtrera ut vilka affärer som stämmer redan i frågan, men om du vill det måste du gör det med HAVING i denna fråga, eftersom det evalueras efter GROUP, till skillnad från WHERE. Frågan nedan bör ge dig alla affärer där värdet stämmer.

SELECT s.id as storeid, s.employees as employees, count(e.madeit) as madeitcount
FROM stores s
LEFT JOIN employees e ON e.storeid = s.id
WHERE e.madeit = 1 
GROUP BY s.id
HAVING s.employees = count(e.madeit)
Medlem sedan aug. 20039 340 inlägg
#5

Vassego. Du får gärna klicka på länken "markera som lösning" ovanför mitt inlägg. :)

263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)