Permalänk

SQL-problem

Hej allihopa!

Jag sitter nu och sätter upp små queries för min hemsida och har nu stött på ett problem. Det är så att jag har en databas med två tables. Ett med olika bilar och dess bil-ID och det andra har en kolumn för förar-ID, namn och bil-ID som föraren kör. Nu är det så att jag skulle vilja köra en join så att det ser ut såhär ungefär:

Bil |Förare |Bil-ID |Förar-ID
ABC 123 | Nått namn, nått annat namn |4 | 65, 45

Det är någon sån join jag skulle vilja ha inte någon av dessa:

Bil |Förare |Bil-ID |Förar-ID
ABC 123 |Nått namn |4 |65
ABC 123 |Nått annat namn |4 |45

All hjälp och förslag uppskattas, tack på förhand!

Permalänk
Medlem

varför vill du ha det så? känns väldigt opraktiskt eftersom hela grejjen med databaser är att du ska få strukturerad data.

Men för att ge svar på din fråga ska du kolla på något som heter merge rows.

Permalänk

Håller med. En av grunderna i SQL är att aldrig få flera värden i en "cell".

Permalänk
Medlem
Skrivet av Wickit:

varför vill du ha det så? känns väldigt opraktiskt eftersom hela grejjen med databaser är att du ska få strukturerad data.

Men för att ge svar på din fråga ska du kolla på något som heter merge rows.

Det beror väl på ändamålet. Kan ju vara så att han bara vill köra läsning (db kanske är stor) och då är ju denormaliserad db att föredra framför en normaliserad.

Permalänk
Medlem

Kan du inte bara köra typ?

SELECT * FROM FÖRARE WHERE NAME = 'SVEN' OR NAME = 'PER' AND BIL-ID = '4' AND FÖRAR-ID IN(45, 65);

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Vilken SQL-server kör du? MySQL, MSSQL?

Skulle det inte bli lättare att ha en tabell med bil-id, en med förar-ID och en med både bil-id samt förar-ID som foreign key? Då blir det nog lättare att skapa en vy som visar det du behöver.

Visa signatur

Moderkort: ASUS Maximus VIII Hero/Alpha | CPU: Intel i7 6700k 4 GHz | Minne: Kingston HyperX 8GB DDR4 2133MHz x4| Systemdisk: Samsung pro 950 256GB | Lagring: WD Purple 3TB x2 | GPU: Asus Strix GTX 970 DirectCU II | Ljudkort: Asus Essence STXII | Display: Samsung S24A650D x2 | Tangentbord: Qpad MK-85 | Mus: Razer Mamba 4G

Permalänk
Medlem
Skrivet av anders.sjoberg:

Bil |Förare |Bil-ID |Förar-ID
ABC 123 | Nått namn, nått annat namn |4 | 65, 45

Det är någon sån join jag skulle vilja ha inte någon av dessa:

Bil |Förare |Bil-ID |Förar-ID
ABC 123 |Nått namn |4 |65
ABC 123 |Nått annat namn |4 |45

Vad är syftet med själva SQL-satsen du vill skriva? Normalt sätt brukar man inte använda både Bil=ABC 123 och Bil-ID=4 eftersom det blir dubbelt och därför är onödigt. Om du vill ha fram alla förare som har koppling till en viss bil är det ju bara att skippa slagningen på förare och du får fram alla. Om du bara vill ha fram vissa förare av ett visst fordon kan du skriva:

SELECT Bil.*, Förare.*
FROM Bil INNER JOIN Förare ON (Bil.Bil-Id = Förare.Bil-Id)
WHERE (Förare.Namn IN ('ett namn', 'ett annat namn', 'ett tredje namn')) eller i bästa fall kör du på WHERE (Förare.Förar-Id IN (45, 65))

En annan variant är att du i joinen byter uf Förare mot (SELECT Förare.* FROM Förare WHERE (Förare.Namn IN ('x','y'))) AS Förare och då kan du skippa WHERE satsen i första exemplet.

Visa signatur

ASUS ROG Strix X570-F, AMD Ryzen 9 5900X, ASUS GTX 1080 Ti Strix Gaming OC, 32GB G.Skill Trident Z Neo CL16 3600MHz, Arctic Freezer II 240, Seasonic Prime Titanium 850W, Phanteks Enthoo Evolv X, 2x Samsung 970 EVO Plus 1TB, Seagate Firecuda 2TB, Seagate Ironwolf 4TB, ASUS PG278Q

ASUS ROG Crosshair VI Hero, AMD Ryzen 9 3900X, ASUS RTX 2060 Dual OC, 16GB G.Skill Flare X CL14 3200 MHz @3200 MHz, Arctic Freezer 240, Seasonic Prime Titanium 850W, Phanteks Eclipse P400S Glass, Samsung 960 Pro 512GB, Samsung 850 Pro 512GB, Seagate Ironwolf 4TB, ASUS PG278Q

ASUS Maximus V GENE, Intel i7 3770K @ 4,6 GHz (1.190 V), EVGA GTX 670 FTW SLi, 8GB G.Skill TridentX CL10 2400 MHz, Samsung 850 Pro 512GB, Samsung 840 Pro 256GB, Corsair Hydro H100i, Corsair AX860i, Fractal Design Define R4W, ASUS PG278Q

Permalänk
Hedersmedlem

Jag skulle tro att vad vi har här är ett XY-problem, så trådskaparen behöver svara på frågan: Vad vill du egentligen göra? Annars kommer andra få tillbringa tid på att sitta här och gissa, din fråga kommer ändras med tiden och till slut visar det sig säkert att allt går att lösa mycket enklare.

Beskriv problemet och varför du vill ha en databasjoin på det sättet.

Min gissning är att du egentligen bara vill ha en enkel join trots allt, och att du bör lösa presentationen i just presentationslagret, helt enkelt (dvs PHP-koden, om det är just PHP du jobbar med).

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Inte för att detta är en svar på din fråga men jag tycker du ska gå och plugga på Normaliserings former i SQL.

http://www.databasteknik.se/webbkursen/normalisering/

Här har du en bra på Svenska. Ett tips är att försöka nå Tredje gradens, det finns fler grader men de är oftast praktiska i specialfall men överlag nå tredje gradens normalisering så får du oftast en helt okej databasstruktur.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Medlem

Du kan ju gruppera efter bilar ser det ut som? Läs om GROUP BY

$q = "SELECT b.bil-id, f.förare, b.bil, f.förare-id FROM bil b JOIN förare f ON b.bil-id=f.bil-id GROUP BY b.bil-id"; // så kan du lägga till en WHERE iaf du vill hämta en specific bil, hämta i assoc arr och det ser ut liknande Array( [bilnamn1] => här ligger alla förare för denna bil, [bilnamn2] => o här för denna ) //sen en foreach eller nått, använd extract() och explode() för att framställa din data vettigt

Skickades från m.sweclockers.com