Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2010-10-17, 12:53
  #1
Medlem
Jag behöver hjälp med en annan PHP-funktion, suck har frågat för mycket här på FB men förstår mig inte på det.

Så här ser databasen ut:


Kolumn:
id, aid, url
1, 3, xxx
2, 4, xxx
4, 3, xxx
8, 2, xxx
7, 4, xxx
9, 3, xxx

När jag visar id=1, som också har värdet aid=3.
Så vill jag visa den nästa som ligger uppåt i tabellen som har aid=3, i det här fallet id=4.

Ifall det hade varit id=2 jag hade tagit fram så hade jag velat få fram id=7 eftersom båda har aid=4.
Citera
2010-10-17, 13:25
  #2
Avstängd
AdagioHouses avatar
Så här?

Kod:
<?php

mysql_connect
('host''user''pass');
mysql_select_db('db');

$x mysql_query('SELECT * FROM table WHERE aid = "4"');

while(
$result mysql_fetch_assoc($x))
  {

    echo 
'<strong>ID:</strong> ' $result['id'] . '<br />';
    echo 
'<strong>Aid:</strong> ' $result['aid'] . '<br />';
    echo 
'<strong>URL:</strong> ' $result['url'] . '<br /><br />';

  }

?>
Citera
2010-10-17, 19:29
  #3
Medlem
Kod:
SELECT * FROM table WHERE aid = (SELECT aid FROM table WHERE id=1);
Citera
2010-10-17, 22:11
  #4
Medlem
Tack för era svar, men jag tror att ni har missförstått mig.
Jag håller på med ett bildgalleri och det är funktionen Föregående och Nästa jag vill ha.

Först väljer man ett album och alla bilder visas.
Sedan väljer man en bild och då vill jag ha den här funktionen.

Ifall vi nu har valt en bild (id=4, aid=3) då vill jag ha två val:
* Nästa som länkar till den närmaste "uppåt" i tabellen som också har aid=3 i det här fallet id=9
* Föregående som länkar till den närmaste "nedåt" i tabellen som också har aid=3 i det här fallet id=1


id, aid, url
1, 3, xxx
2, 4, xxx
4, 3, xxx
8, 2, xxx
7, 4, xxx
9, 3, xxx
Citera
2010-10-17, 22:38
  #5
Avstängd
AdagioHouses avatar
Citat:
Ursprungligen postat av NoWeR
Tack för era svar, men jag tror att ni har missförstått mig.
Jag håller på med ett bildgalleri och det är funktionen Föregående och Nästa jag vill ha.

Säg det från början då.

Vad är "aid" för någonting?
Citera
2010-10-17, 23:05
  #6
Medlem
Citat:
Ursprungligen postat av AdagioHouse
Säg det från början då.

Vad är "aid" för någonting?
Album ID
Citera
2010-10-17, 23:23
  #7
Medlem
gadzooxs avatar
Kod:
SELECT
	i.*,
	prev.id as PrevId,
	next.id as NextId
FROM Images i
LEFT JOIN Images prev ON prev.aid = i.aid AND prev.id < i.id
LEFT JOIN Images next ON next.aid = i.aid AND next.id > i.id
WHERE i.id = 4   -- Peta in den aktuella bildens ID här
ORDER BY i.id ASC, PrevId DESC, NextId ASC
LIMIT 1




Edit: två subqueries, men mer flexibelt:
Kod:
SELECT
	i.*,
	(SELECT id FROM Images WHERE aid=i.aid AND id < i.id ORDER BY id DESC LIMIT 1) AS PrevId,
	(SELECT id FROM Images WHERE aid=i.aid AND id > i.id ORDER BY id ASC LIMIT 1) AS NextId
FROM Images i
--WHERE i.id = 4   -- Skippa WHERE-clausen för att lista alla poster inklusive deras respektive föregående och nästa
__________________
Senast redigerad av gadzoox 2010-10-17 kl. 23:28.
Citera
2010-10-18, 06:36
  #8
Moderator
Protons avatar
PHP -> Databaser /Mod
Citera
2010-10-18, 17:26
  #9
Medlem
Varför krångla till det så? Hämta ut alla bilder tillhörande ett album. Använd sedan PHP för att välja vilken bild som skall visas. På det viset så är det enkelt om du vill skapa mer funktionalitet i framtiden, exempelvis visa en miniatyr av kommande/föregående bild etc.

Om ett album har 10 bilder så vandra 1,2,3 etc. PHP vet ju hur många bilder som finns i albumet. Blir dessutom 1 query per album.
Citera
2010-10-18, 18:08
  #10
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av deejam
Varför krångla till det så? Hämta ut alla bilder tillhörande ett album. Använd sedan PHP för att välja vilken bild som skall visas. På det viset så är det enkelt om du vill skapa mer funktionalitet i framtiden, exempelvis visa en miniatyr av kommande/föregående bild etc.

Om ett album har 10 bilder så vandra 1,2,3 etc. PHP vet ju hur många bilder som finns i albumet. Blir dessutom 1 query per album.
Ett särdeles tanklöst tips med tanke på att HTTP är stateless. Det blir alltså en query per album per sidladdning, per besökare, såvida man inte cachear resultatet på något sätt med någon form av sliding expiration, men då hamnar krånglet där istället.

Det blir iofs en query per page hit oavsett om man laddar alla poster eller bara en. Om albumet har 10 bilder och sidan har få besökare så kanske det kvittar att man brute:ar skiten, men när datamängderna och trafiken ökar blir det plötsligt väldigt ineffektivt att returnera 300 poster för att sedan bara bry sig om en av dem, för att vid "Next>>" ladda samma 300 poster men bara bry sig om nästa post.
__________________
Senast redigerad av gadzoox 2010-10-18 kl. 18:10.
Citera
2010-10-18, 19:01
  #11
Medlem
Citat:
Ursprungligen postat av gadzoox
Ett särdeles tanklöst tips med tanke på att HTTP är stateless. Det blir alltså en query per album per sidladdning, per besökare, såvida man inte cachear resultatet på något sätt med någon form av sliding expiration, men då hamnar krånglet där istället.

Det blir iofs en query per page hit oavsett om man laddar alla poster eller bara en. Om albumet har 10 bilder och sidan har få besökare så kanske det kvittar att man brute:ar skiten, men när datamängderna och trafiken ökar blir det plötsligt väldigt ineffektivt att returnera 300 poster för att sedan bara bry sig om en av dem, för att vid "Next>>" ladda samma 300 poster men bara bry sig om nästa post.
Har du vaknat på fel sida idag?
Citera
2010-10-18, 19:09
  #12
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av deejam
Har du vaknat på fel sida idag?
Jag vaknar alltid på den sidan som föredrar optimering framför resursslöseri


(Säger han som postar en lösning med två subqueries...)
Men hur man än vänder och vrider på det, finns det alltid en punkt då resultatet når break-even och går om en lösning som brutear alla rader gång på gång. Det var bara det jag ville påskina. Det och faktumet att HTTP är stateless, vilket man bör ha i bakhuvudet när man bestämmer sig för en lösning.
__________________
Senast redigerad av gadzoox 2010-10-18 kl. 19:12.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback