Avatar billede artico Novice
19. maj 2013 - 15:08 Der er 15 kommentarer og
1 løsning

if med flere SELECT i Mysql

Hejsa, jeg forsøger at hente fra DB, men hvis feltet er tomt skal der søges i en anden tabel, som dette:

$hent_sprog = "
    IF (SELECT * FROM sprog_system_front WHERE sprog_id = "")
    SELECT * FROM sprog_system_front WHERE sprog_id = 1
  ELSE
    BEGIN
    SELECT * FROM sprog_system_front WHERE sprog_id = '".$_SESSION['lang']."'
      END
      ";

Men der er en fejl, som nok har med php indpakningen af gøre? Er der nogen bud?
Avatar billede erikjacobsen Ekspert
19. maj 2013 - 15:19 #1
Det der sql er vist ikke lige sådan man gør i dag ;)  Men vigtigere, så er det vist heller ikke det du vil ha'.

Mener du ikke at hvis $_SESSION['lang'] er tom/ikke-eksisterende, så skal man anvende sprog_id 1 ??
Avatar billede artico Novice
19. maj 2013 - 15:28 #2
Ikke helt, der er altid "noget" i $_SESSION, men feltet i DB kan være tomt, og jeg vil gerne hente i én query:

alle felter hvor der er data med: sprog_id =  $_SESSION
(select * FROM sprog_system_front WHERE sprog_id = '".$_SESSION['lang']."')

Hvis et felt skulle være tomt: skal feltet hentes med sprog_id =1

(select * FROM sprog_system_front WHERE sprog_id = 1)

det er det jeg gerne vil ....
19. maj 2013 - 16:49 #3
Du siger, at der er en fejl.  Så ville det være hjælpsomt, hvis du fortæller hvilken fejl.  Får du en fejlmelding, så fortæl hvor den opstår og hvad den siger.  Hvis du ikke får nogen fejlmelding, men dit resultat er noget andet end det du forventede, så forklar nærmere.

Men du siger, at der altid er en værdi, et nummer, i $_SESSION['lang'.  Du vil selecte den række i tabellen sprog_system_front hvor sprog_id = $_SESSION['lang.  Hvis der ikke er nogen sprog_id med denne værdi vil du i stedet selecte den række hvor sprog_id = 1.  Er det rigtigt forstået?

Jeg ville tro (men har ikke testet) at det kunne gøres som dette:

$id = $_SESSION['lang'];
$result = mysql_query("SELECT * FROM sprog_system_front WHERE sprog_id = $id");
if(!$result) $result = mysql_query("SELECT * FROM sprog_system_front WHERE sprog_id = 1");
Avatar billede artico Novice
19. maj 2013 - 17:06 #4
Jo, det forstår jeg, men fejlen er at mit select er pakket forkert ind i php.. tror jeg, fejlen er at der er en fejl i select?

men anyway det jeg gerne vil er:
jeg har denne DB:
sprog_system_front_id | sprog_id | felt1 | felt2 | felt3
    1          |    1    | text  | text  | text
    2            | 2        | text  |      | text
        3            | 3        | text  | text  | text

Når $_SESSION = 2, vil jeg gerne hente data ud med sprog_id=2, men som det ses er felt2 i sprog_id 2 TOMT, derfor skal dette felt erstattes med (samme felt) felt2 dog med sprog_id 1.

Det er det jeg gerne vil i en forespørgsel...
Avatar billede artico Novice
19. maj 2013 - 17:08 #5
sprog_system_front_id|sprog_id|felt1|felt2|felt3
1|1|text|text|text
2|2|text|(tom)|text
3|3|text|text|text
19. maj 2013 - 18:26 #6
Fordi din select er pakket forkert ind i php foreslog jeg, baseret på min forståelse af problemet, at pakke det bedre ind.  Men jeg er ikke krystal sikker på, at jeg forstår dig.  Hvis nu tabellen er denne:

id sprog_id felt1 felt2 felt3
1  1 tekst1 tekst2 tekst3
2 2 tekst4 tom tekst6
3 3 tekst7 tekst8 tekst9
4 4 tom tekst11 tekst12

Hvis $_SESSION['lang'] = 3, så vil du have udskrevet 3 3 tekst7 tekst8 tekst9.  Så meget forstår jeg. 

Hvis $_SESSION['lang'] = 2, så konstatere der, at der i rækken med sprog_id = 2 er et tomt felt.  Så kan jeg opfatte det du vil på to forskellige måder:

Måde 1:  Du vil i stedet have udskrevet rækken hvor sprog_id = 1, altså 1 1 tekst1 tekst2 tekst3?
Måde2:  Du vil have have udskrevet rækken med sprog_id = 2 undtagen at du vil have det tomme felt erstattet med det tilsvarende felt i sprog_id = 1, altså 2 2 tekst4 tekst2 tekst6?  Hvis det sidste er tilfældet, så ønsker du, hvis $_SESSION['lang'] = 4, at få udskrevet 4 4 tekst1 tekst11 tekst12.

Så hvad er det du vil?  Måde 1, eller måde 2, eller noget helt tredje?
Avatar billede artico Novice
19. maj 2013 - 18:36 #7
Jepsen... det er Måde 2 jeg er ude efter!
:-)
19. maj 2013 - 19:18 #8
Den er jeg ikke sikker på jeg kan hjælpe med at løse.  (Men nu fik jeg hjulpet med til at få problemstillingen forklaret.  Så er der måske andre der kan hjælpe videre.)
Avatar billede artico Novice
19. maj 2013 - 19:24 #9
Takker... vi får se :-)
Avatar billede arne_v Ekspert
19. maj 2013 - 21:54 #10
Noget a la:

mysql> CREATE TABLE sprog_system_front (
    ->    id INTEGER NOT NULL,
    ->    sprog_id INTEGER,
    ->    felt1 VARCHAR(50),
    ->    felt2 VARCHAR(50),
    ->    felt3 VARCHAR(50),
    ->    PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> INSERT INTO sprog_system_front VALUES(1,1,'tekst1','tekst2','tekst3');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO sprog_system_front VALUES(2,2,'tekst4',NULL,'tekst6');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO sprog_system_front VALUES(3,3,'tekst7','tekst8','tekst9');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO sprog_system_front VALUES(4,4,NULL,'tekst11','tekst12');
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> SELECT *
    -> FROM sprog_system_front;
+----+----------+--------+---------+---------+
| id | sprog_id | felt1  | felt2  | felt3  |
+----+----------+--------+---------+---------+
|  1 |        1 | tekst1 | tekst2  | tekst3  |
|  2 |        2 | tekst4 | NULL    | tekst6  |
|  3 |        3 | tekst7 | tekst8  | tekst9  |
|  4 |        4 | NULL  | tekst11 | tekst12 |
+----+----------+--------+---------+---------+
4 rows in set (0.00 sec)

mysql>
mysql> SELECT t.id,t.sprog_id,COALESCE(t.felt1,tdefault.felt1) AS felt1,COALESCE(t.felt2,tdefault.felt2) AS felt2,COALESCE(t.felt2,tdefault.felt2) AS felt3
    -> FROM sprog_system_front t,(SELECT * FROM sprog_system_front WHERE sprog_id=1) tdefault;
+----+----------+--------+---------+---------+
| id | sprog_id | felt1  | felt2  | felt3  |
+----+----------+--------+---------+---------+
|  1 |        1 | tekst1 | tekst2  | tekst2  |
|  2 |        2 | tekst4 | tekst2  | tekst2  |
|  3 |        3 | tekst7 | tekst8  | tekst8  |
|  4 |        4 | tekst1 | tekst11 | tekst11 |
+----+----------+--------+---------+---------+
4 rows in set (0.00 sec)

mysql>
mysql> DROP TABLE sprog_system_front;
Query OK, 0 rows affected (0.01 sec)
20. maj 2013 - 06:58 #11
arne_v, jeg lytter med og lærer med.  COALESCE kendte jeg ikke.  (Jeg spottede en tyrkfejl i den tredje COALESCE, skulle have været COALESCE(t.felt3,tdefault.felt3) AS felt3 ).
Avatar billede artico Novice
20. maj 2013 - 11:01 #12
Wau, det ser rigtig spændende ud, og noget jeg kan sagtens kan bruge, men kan man hente alle feler ud med * eller ryger fidusen...?
Avatar billede arne_v Ekspert
20. maj 2013 - 15:06 #13
christian - ja - for meget copy paste
Avatar billede arne_v Ekspert
20. maj 2013 - 15:06 #14
artico - nej - du kan ikke bruge * - men man vil vel stort set aldrig bruge * i serioes kode, saa .....
Avatar billede artico Novice
20. maj 2013 - 15:37 #15
Det kan der være noget om  :-) Send et svar ...
Avatar billede arne_v Ekspert
20. maj 2013 - 18:01 #16
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester