WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hämta två rader från samma tabell SQL (https://www.wn.se/forum/showthread.php?t=1060409)

yakuzaemme 2014-01-09 22:13

Hämta två rader från samma tabell SQL
 
Har två tabeller, företag och oppettider.

Tabellen oppettider har 7 rader, en för varje veckodag. Det jag skulle vilja göra är att hämta 2 dagar (dagens samt gårdagens) från tabellen öppettider i samma query som jag hämtar företag.

Kommer dock inte på någon vettig lösning. Någon som vill bolla lite och komma på något smart?


företag
id | namn

oppettider
id | dag | foretag | open | close

Där dag kan vara "mon", "tue", "wed", "thu" etc.

tartareandesire 2014-01-09 22:32

Om jag inte missuppfattat något så är det väl bara att köra något sånt här:

Kod:

SELECT * FROM foretag AS f
JOIN oppettider AS o ON o.foretag = f.id
WHERE f.id = {företagsid}
AND o.dag IN ('mon', 'tue')


HenrikAI 2014-01-09 22:36

Hoppas jag inte missförstod dig nu, men du kan göra en join på samma tabell flera gånger.

Typ så här (med reservation för fel):

Kod:

SELECT foretag.id, foretag.name, idag.open, idag.close, igår.open, igår.close
FROM foretag
INNER JOIN oppettider AS idag ON (idag.foretag = foretag.id AND idag.dag = ...)
INNER JOIN oppettider AS igår ON (igår.foretag = foretag.id AND igår.dag = ...)
WHERE foretag.id = ...


yakuzaemme 2014-01-09 22:42

Citat:

Ursprungligen postat av tartareandesire (Inlägg 20484278)
Om jag inte missuppfattat något så är det väl bara att köra något sånt här:

Kod:

SELECT * FROM foretag AS f
JOIN oppettider AS o ON o.foretag = f.id
WHERE f.id = {företagsid}
AND o.dag IN ('mon', 'tue')


Returnerar bara 1 record från öppettider-tabeller, den första (vilket är mon i detta fall)

yakuzaemme 2014-01-09 22:45

Citat:

Ursprungligen postat av HenrikAI (Inlägg 20484279)
Hoppas jag inte missförstod dig nu, men du kan göra en join på samma tabell flera gånger.

Typ så här (med reservation för fel):

Kod:

SELECT foretag.id, foretag.name, idag.open, idag.close, igår.open, igår.close
FROM foretag
INNER JOIN oppettider AS idag ON (idag.foretag = foretag.id AND idag.dag = ...)
INNER JOIN oppettider AS igår ON (igår.foretag = foretag.id AND igår.dag = ...)
WHERE foretag.id = ...


Ser ju ut som det borde fungera, men returnerar enbart open/close för gårdagen (den första "matchningen" dvs)

yakuzaemme 2014-01-09 22:46

oppettider-tabellen ser ut såhär (företagsid 10)

id | foretag | dag | open | close

Citat:

1 - 10 - mon - 08:00 - 16:00
2 - 10 - tue - 08:00 - 16:00
3 - 10 - wed - 08:00 - 16:00
4 - 10 - thu - 08:00 - 16:00
5 - 10 - fri - 08:00 - 16:00
6 - 10 - sat - 08:00 - 16:00
7 - 10 - sun - 08:00 - 16:00

tartareandesire 2014-01-09 22:48

Citat:

Ursprungligen postat av yakuzaemme (Inlägg 20484280)
Returnerar bara 1 record från öppettider-tabeller, den första (vilket är mon i detta fall)

Fungerar utmärkt för mig, gjorde ett par små testtabeller och får två rader som resultat precis som väntat. Henriks exempel ovan med dubbla joins är onödigt tillkrånglat. Känns som att du gör något annat galet :) Ställer du frågan direkt mot databasen eller kollar du kodresultat?

yakuzaemme 2014-01-09 22:51

Citat:

Ursprungligen postat av tartareandesire (Inlägg 20484284)
Fungerar utmärkt för mig, gjorde ett par små testtabeller och får två rader som resultat precis som väntat. Henriks exempel ovan med dubbla joins är onödigt tillkrånglat. Känns som att du gör något annat galet :) Ställer du frågan direkt mot databasen eller kollar du kodresultat?

Såg din edit nu. Kollar kodresultat, och den returnerar ju två objekt (dvs. hela företagsobjektet + öppettider för måndag, och sedan hela företagsobjektet + öppettider för tisdag). Går det att baka in både måndag och tisdag i samma?

HenrikAI 2014-01-09 22:55

Citat:

Ursprungligen postat av yakuzaemme (Inlägg 20484285)
Såg din edit nu. Kollar kodresultat, och den returnerar ju två objekt (dvs. hela företagsobjektet + öppettider för måndag, och sedan hela företagsobjektet + öppettider för tisdag). Går det att baka in både måndag och tisdag i samma?

Hyfsat säker på att min ska fungera..

Kod:

CREATE TABLE IF NOT EXISTS `foretag` (
  `id` int(11) NOT NULL,
  `name` varchar(256) NOT NULL
);

INSERT INTO `foretag` (`id`, `name`) VALUES
(1, 'test');

Kod:

CREATE TABLE IF NOT EXISTS `oppettider` (
  `id` int(11) NOT NULL,
  `foretag` int(11) NOT NULL,
  `dag` varchar(3) NOT NULL,
  `open` int(11) NOT NULL,
  `close` int(11) NOT NULL
);

INSERT INTO `oppettider` (`id`, `foretag`, `dag`, `open`, `close`) VALUES
(1, 1, 'tue', 10, 16),
(2, 1, 'mon', 11, 15);

Kod:

SELECT foretag.id, foretag.name, idag.open, idag.close, igår.open, igår.close
FROM foretag
INNER JOIN oppettider AS idag ON ( idag.foretag = foretag.id AND idag.dag =  'tue' )
INNER JOIN oppettider AS igår ON ( igår.foretag = foretag.id AND igår.dag =  'mon' )
WHERE foretag.id =1

Kod:

id | name | open | close | open | close
1 | test | 10 | 16 | 11 | 15

EDIT: Ändra till idag.open AS a, idag.close AS b, igår.open AS c, igår.open AS d så ser du att det fungerar i din kod. mysql_fetch_assoc kan inte hantera att du plockar ut flera kolumner med samma namn.

tartareandesire 2014-01-09 22:57

Citat:

Ursprungligen postat av yakuzaemme (Inlägg 20484285)
Såg din edit nu. Kollar kodresultat, och den returnerar ju två objekt (dvs. hela företagsobjektet + öppettider för måndag, och sedan hela företagsobjektet + öppettider för tisdag). Går det att baka in både måndag och tisdag i samma?

Alltså, du får två rader som resultat vilket du också ska få. Huruvida du sedan gör två objekt eller inte beror helt på din kodstruktur, det har inget med databasfrågan att göra.


Alla tider är GMT +2. Klockan är nu 14:59.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson