webForumDet fria alternativet

Hämta det ena eller det andra

Databaser & SQLur Databashanterare & SQL

18 svar · 742 visningar · startad av learn

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

Jag har en tabell som innehåller en sidas innehåll. Om användaren inte har skapat ett eget innehåll så ska default-innehållet visas. Jag vill alltså ha en query som i första hand hämtar användarens egna innehåll och om det inte finns så ska default-innehållet istället hämtas. Har användaren skapat ett eget så finns default fortfarande kvar. Hämta antingen det ena eller det andra, inte båda.

Hus ska jag formulera query:n?

Tabell: Sidor
Attribut: sidaID, skapareID, text

Default-innehållet har skapareID = 0

Medlem sedan jan. 20051 130 inlägg
#2

Ingen som vet hur man gör?

Medlem sedan dec. 20025 483 inlägg
#3

Du får nog ställa två frågor. Pseudokod:

r = select * from tabell where skapareid = <id>;

if empty(r)
  r = select * from tabell where skapareid = 0;
end
Medlem sedan jan. 20051 130 inlägg
#4

Ok, får köra på det då.

Medlem sedan dec. 200012 464 inlägg
#5
select *
 from t
where skapareid = <id>
 or (skapareid = 0 
  and not exists (select * 
     from t 
  where skapareid = <id>)
Medlem sedan dec. 20025 483 inlägg
#6

LarsG: :bire

Medlem sedan jan. 20051 130 inlägg
#7

Såja, tackar!

Medlem sedan jan. 20051 130 inlägg
#8

Nähe vänta nu... Det fungerar bra om det endast är ett innehåll... Om en sida har flera innehåll så hämtas bara det ena... Den ska ju kunna ha tex. 2 egna innehåll och 3 default innehåll. Kanske var lite oklar... Hjälp!

Medlem sedan dec. 200012 464 inlägg
#9

Kan du ge exempel på datainnehåll och förväntat resultat?

Medlem sedan jan. 20051 130 inlägg
#10

Användarens sida loopar ut dess innehåll mha:

while ($r = mysql_fetch_array($sql))

Låt säga att en sida innehåller 5st default-innehåll. Alla 5 + egen-skapade-innehåll ska loopas ut. Har användaren ändrat något default-innehåll så sparas detta som ett eget innehåll (default-innehållet förblir intakt men visas inte på sidan)...

Alltså en sida kan innehålla fler en ett innehåll, både default (id=0) och egna... Den kod jag fick av dig fungerar perfekt, men endast om det är ett innehåll.

Hoppas du förstår!

Medlem sedan jan. 20051 130 inlägg
#11

Sorry, jag insåg nu det paradoxala. Innehållen måste ju ha något gemensamt för att kunna uteslutas...

Återkommer ifall jag inte lyckas lösa det...

Medlem sedan jan. 20051 130 inlägg
#12

Nej, vänta nu föresten. Det ska ju gå tycker jag... Det som avgör och kan hålla innehållet i sär är dess typ. Så varje sida får inte innehålla innehåll av samma typ.

Alltså:

Hämta text från sidor där id=<id> eller id=0 och typ inte finns med id=<id>

Hjälp mig!

Medlem sedan jan. 20051 130 inlägg
#13

Något sql-snille som har lust att hjälpa mig...?

Kort och konsist så vill jag:

Hämta "text" från "contents" där "id" är "$id" eller där "id" är "0"

Finns både id=$id och id=0 på samma "typ" så skall endast posten med id=$id hämtas. Är det inte samma "typ" så skall båda hämtas - aldrig två av samma typ.

Någon måste ju veta hur man gör, please!

Medlem sedan dec. 200012 464 inlägg
#14

Kan du ge exempel på datainnehåll och förväntat resultat?

Du har inte gett något exempel så jag förstår inte vad som är problemet med min ursprungliga fråga.

Medlem sedan jan. 20051 130 inlägg
#15

Ok, jag bifogar hela min kod:

<?
// Hämtar innehåll
$sql= mysql_query("SELECT text FROM sidor WHERE sektion='1' AND userID='$_SESSION[userID]' OR userID='0' AND NOT EXISTS (SELECT userID FROM sidor WHERE userID='$_SESSION[userID]')");

// Loopar ut innehållet
while ($r = mysql_fetch_array($sql)) {
?>
	<p><?=$r["text"]?></p>
<?
}
?>

Detta skall då resultera i att sidan fylls med den text som är sparad i databasen för just denna användare. Koden ovan fungerar ifall användaren inte har något eget innehåll, men så fort denne har det så visas bara det och inte de andra default-innehållena.

Medlem sedan dec. 20025 483 inlägg
#16

Vad Lars menar med "datainnehåll" och "förväntat resultat", är att du skall posta exempelinnehåll från tabellen:

id | name | address
-------------------
1  | foo  | bar
-------------------
2  | ...  | u.s.w.
-------------------

Samt hur du förväntar dig att resultatet skall bli:

id | name
---------
1  | foo 
---------
7  | faa 
---------
9  | ...
---------
Medlem sedan jan. 20051 130 inlägg
#17

Heh, sorry.

id | text | typ
-------------------
0 | hej | överst
-------------------
1 | blabla | överst
-------------------
0 | blabla | nederst

Om användaren har id 1 så ska det bli:

id | text
-----------
1 | blabla
-----------
0 | blabla

Medlem sedan dec. 20025 483 inlägg
#18
select c.id
     , c.text 
  from contents c
 where c.id = <id>
    or ( c.id = 0
         and c.typ not in ( select c2.typ
                              from contents c2
                             where c2.id = <id>))
Medlem sedan jan. 20051 130 inlägg
#19

Funka kanonfint, äntligen! Tack :) :birp

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)