MySQL: Hjälp med avancerad(?) datum-dribblare

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2004-10-21 00:40

Jag har en variable i MySQL som är ett datum, "@datum='2004-10-21'". Nu behöver jag en SQL-sats som levererar variabeln "@alla_datum", d.v.s alla datum (må-sö) i den veckan som '2004-10-21' ingår i.

MySQL-variabeln '@alla_datum' ska således se ut så här:
'2004-10-18 2004-10-19 2004-10-20 2004-10-21 2004-10-22 2004-10-23 2004-10-24'.
Ett mellanslag mellan varje datum i den aktuella veckan (i detta exempel vecka 43).

Senast redigerat 2004-10-21 07:47
  • Medlem
  • Stockholm
  • 2004-10-21 11:59

Lite genant att erkänna, men jag vet inte om jag någonsin använt MySQL-variabler. Lust att förklara lite? Kanske ett enkelt exempel ?

  • Medlem
  • International user
  • 2004-10-21 13:50

Variabler i MySQL kan t.ex. bygga sökningar baserade på andra sökningar och funktioner. Yttre variabler från t.ex. shellet och/eller interna variabler. Variablers livstid är per connection. Enkelt exempel som slår ihop 3 textsträngar:

mysql> SET @var1='Hej',
    -> @var2='99Mac';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @var3=CONCAT(@var1,' ',@var2);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @var3;
+-----------+
| @var3     |
+-----------+
| Hej 99Mac |
+-----------+
1 row in set (0.00 sec)

mysql>

Ett annat exempel sätter värdet på en variabel (@day_nr) med en sökning i databasen:

SELECT @day_nr:=DATE_FORMAT(datum,'%w') from databasnamn.tablenamn WHERE ID=115;
Senast redigerat 2004-11-01 08:53
  • Medlem
  • Stockholm
  • 2004-10-21 15:57

Aha
Man tackar! Högst intressant att veta... dags att läsa en fortsättningskurs i databaser

Ser framför mig att tonvis av PHP-script som hämtar hem id'n för att sedan användas i nästa sql-fråga istället kan registrera värdet som en SQL-variabel och användas i nästa fråga. I see...

Läste någonstans att större webbapplikationer bör öppna kopplingen till databasen, fråga sin fråga och sen stänga den direkt för att tillåta maximalt antal besökare på hemsidan samtidigt. Om man behöver fråga flera frågor per dokument så ska man således göra flera uppkopplingar/nedkopplingar. Vad som tar tid är att fråga frågan, anslutningen är försummbar.

Men variablerna fanns bara per anslutning?

  • Medlem
  • International user
  • 2004-10-21 16:17
Ursprungligen av ivar:

Läste någonstans att större webbapplikationer bör öppna kopplingen till databasen, fråga sin fråga och sen stänga den direkt för att tillåta maximalt antal besökare på hemsidan samtidigt. Om man behöver fråga flera frågor per dokument så ska man således göra flera uppkopplingar/nedkopplingar. Vad som tar tid är att fråga frågan, anslutningen är försummbar.

Men variablerna fanns bara per anslutning?

Har hört tvärt om: Bättre att ställa en "stor" fråga en gång, än att göra flera connections till databasen. Men det blir väl till sist en avvägning. "Application and database tuneup"...

Variablerna finns bara kvar under varje connection.

  • Medlem
  • Stockholm
  • 2004-10-21 16:32

Ja så har jag också hört. Hellre större frågor och färre förfrågningar.

Vad jag menade var att om man kommer behöva ställa två frågor (kanske helt olika sektioner av en hemsida tex) så skall man terminera uppkopplingen därimellan för att tillåta andra användare att hinna göra eventuella förfrågningar innan man kopplar upp igen och frågar på nytt.

Ursprungligen av ivar:

Ja så har jag också hört. Hellre större frågor och färre förfrågningar.

Vad jag menade var att om man kommer behöva ställa två frågor (kanske helt olika sektioner av en hemsida tex) så skall man terminera uppkopplingen därimellan för att tillåta andra användare att hinna göra eventuella förfrågningar innan man kopplar upp igen och frågar på nytt.

...eller så att man använder sig av anslutningspooler, så att varje förfrågning inte behöver leda till att en ny anslutning görs, utan att man bara väljer en öppen anslutning i poolen. Med php gör man det med *_pconnect()-funktionerna, kör man andra språk kan samma sak annars enkelt åstadkommas under FastCGI.

  • Medlem
  • International user
  • 2004-10-21 21:37

OK, nog om anslutningar. Tillbaka till trådens kärna, tack.

  • Medlem
  • International user
  • 2004-10-21 23:55

Den här fungerar, men känns som den kan optimeras. Borde gå att typ "loopa" på något sätt. Men mitt problem är löst. Logiken är att alla datum plus/minus 7 dagar kollas att de har samma veckonummer som den angivna datumet. Då byggs strängen på av typen n=n+1.

SET @datum='2004-10-21';
SET @datum_alla='';
SELECT @vecka:=WEEK(@datum,3);

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 7 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 7 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 6 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 6 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 5 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 5 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 4 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 4 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 3 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 3 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 2 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 2 DAY)),'nej');

SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 1 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 1 DAY)),'nej');


SELECT IF(WEEK(DATE_SUB(@datum, INTERVAL 0 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_SUB(@datum, INTERVAL 0 DAY)),'nej');



SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 1 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 1 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 2 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 2 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 3 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 3 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 4 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 4 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 5 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 5 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 6 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 6 DAY)),'nej');

SELECT IF(WEEK(DATE_ADD(@datum, INTERVAL 7 DAY),3)=@vecka,
@datum_alla:=CONCAT(@datum_alla,'<BR>',DATE_ADD(@datum, INTERVAL 7 DAY)),'nej');



SELECT @datum_alla;

Skriver ut följande på en HTML-sida. Alla datum i veckan där 2004-10-21 ingår:

2004-10-18
2004-10-19
2004-10-20
2004-10-21
2004-10-22
2004-10-23
2004-10-24

1
Bevaka tråden