FAQ |
Kalender |
![]() |
#11 | |||
|
||||
Medlem
|
Citat:
Tack för tipset! Körde precis: Kod:
SQL: ALTER TABLE kategori-koppling DROP id; ALTER TABLE kategori-koppling ADD UNIQUE ( register_id, kat_id ); Citat:
|
|||
![]() |
![]() |
![]() |
#12 | ||
|
|||
Medlem
|
Där ser man vad slow writing kan leda till... Jajja... Vidare.
Jag ser det svårt att lösa det med en generell SQL. Som jag förstår det så vill du på en och samma rad få ut olika många kategorier beroende på hur många kategorier en registerrad har. Problemet med det tänket är att varje rad måste innehålla exakt lika många kolumner. Och det skulle inte bli fallet om en rad har en kategori, en annan tre. Det går att lösa, som du är inne på, med en left join. Men då måste du veta innan hur många kategorier det kan finnas för en registerrad innan du ställer frågan. Enklast gör du det genom att begränsa antalet kategorier en registerrad kan ha, genom att göra en kolumn per kategori. Säg att vi begränsar det till tre. Då skulle registertabellen (rt i sqlen) se ut som följer: [id] [namn] [cat1id] [cat2id] [cat3id] Kategoritabellen (ct i sqlen): [catid] [namn] SQLen skulle se ut som följer: Kod:
SELECT * rt.name * ct1.name cat1name * ct2.name cat2name * ct3.name cat3name FROM * rt * LEFT JOIN ct AS ct1 ON rt.cat1id=ct1.catid * LEFT JOIN ct AS ct2 ON rt.cat2id=ct2.catid * LEFT JOIN ct AS ct3 ON rt.cat3id=ct3.catid Det skulle vara möjligt att göra den mer dynamisk. Men jag tror att klockan är för mycket för att jag ska kunna förklara det rätt. Principen är en blandning av den jag förklarat här, och den som diskuterats innan. EDIT: Jag är tydligen för långsam idag. Detta är ett svar på Tvartoms meddelande kl 2309 (servern verkar ha sommartid fortfarande) *vad övrigt är* Nokias "Get togeather do whatever" reklam har ett otroligt skönt soundtrack! |
||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Medlem
|
Citat:
|
||
![]() |
![]() |
![]() |
#14 | |||
|
||||
Supermoderator
|
Citat:
|
|||
![]() |
![]() |
![]() |
#15 | ||
|
|||
Medlem
|
Tack heyday... Ditt svar gjorde att jag kom på följande lösning:
Kod:
SQL: SELECT id, namn FROM kat_tbl Kod:
<?PHP // kategori_id sparade i $kat $sql = "SELECT register_tbl.*"; foreach ($kat as $value) { * $sql .= ", k".$value.".kat_tbl_id"; } $sql .= " FROM register_tbl"; foreach ($kat as $value) { * $sql .= " LEFT JOIN koppling_tbl AS k".$value." ON (k".$value.".register_tbl_id = register_tbl.id AND k".$value.".kat_tbl_id = ".$value.")"; } ?> Kod:
SQL: SELECT * register_tbl.*, * k1.kat_tbl_id, * k2.kat_tbl_id FROM register_tbl * LEFT JOIN koppling_tbl AS k1 ON (k1.register_tbl_id = register_tbl.id AND k1.kat_tbl_id = 1) * LEFT JOIN koppling_tbl AS k2 ON (k2.register_tbl_id = register_tbl.id AND k2.kat_tbl_id = 2) Kod:
SQL: SELECT * register_tbl.*, * IF(k1.kat_tbl_id IS NULL, 0, 1) AS k1, * IF(k2.kat_tbl_id IS NULL, 0, 1) AS k2 FROM register_tbl * LEFT JOIN koppling_tbl AS k1 ON (k1.register_tbl_id = register_tbl.id AND k1.kat_tbl_id = 1) * LEFT JOIN koppling_tbl AS k2 ON (k2.register_tbl_id = register_tbl.id AND k2.kat_tbl_id = 2) |
||
![]() |
![]() |
![]() |
#16 | ||
|
|||
Medlem
|
Citat:
|
||
![]() |
![]() |
![]() |
#17 | |||
|
||||
Klarade millennium-buggen
|
Känns som om du kanske bör kolla över behovet istället och fundera på varför du måste ha x antal kolumner istället för x antal rader i recordset'et. Vill du slippa räkna kategorierna så kan du slänga in en count i sql'en för antal kategorierna per register om det underlättar? (svårt att ge tips om man inte vet i vilket sammanhang det ska användas)
Då får du som svar typ: Kod:
Id Register * Kategori * *Antal 1 Kalle * * * *Luleå * * * * 3 1 Kalle * * * *Gävle * * * * 3 1 Kalle * * * *Stockholm *3 2 Svenne * *Kiruna * * * *1 3 Berra * * * Luleå * * * * *2 3 Berra * * * Malmö * * * *2 |
|||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Supermoderator
|
Citat:
A PRIMARY KEY is a unique KEY where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, MySQL will declare them so implicitly (and silently). A table can have only one PRIMARY KEY. If you don't have a PRIMARY KEY and an application asks for the PRIMARY KEY in your tables, MySQL returns the first UNIQUE index that has no NULL columns as the PRIMARY KEY.[/quote] Vad nog detta jag tänkte på, men minne är inte vad det borde. ![]() |
||
![]() |
![]() |
![]() |
#19 | ||
|
|||
Medlem
|
Robert: Att lista antal är en annan bra idé, som kan användas!
Just nu tänkte jag lista upp register i en <table> och visa tillhörande kategorier: (Att ha flera kolumner passar utmärkt här... Typ: Kod:
<table> <tr> <th>Namn</th> <th>Kat 1</th> <th>Kat 2</th> <th>Kat 3</th> </tr> <tr> <td>post 1</td> <td> x </td> <td> </td> <td> </td> </tr> <tr> <td>post 2</td> <td> </td> <td> x </td> <td> x </td> </tr> </table> Jag tackar så hemskt mycket för alla svar! |
||
![]() |
![]() |
Svara |
|
|