[PHP+MySQL] Twee queries nodig?

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • lvh
  • Registratie: Juli 2001
  • Laatst online: 02-11-2022
Ik probeer een PHP-pagina te maken die transacties uit een database opvraagt. Ik heb een table voor de transacties. Die bevat een row voor de accountid waarvan het geld komt (fromaccountid) en een accountid voor wie het geld bestemd is (toaccountid), naast andere dingen zoals hoeveelheid, datum...

Die accountid's worden vertaald naar echte bedrijven via een table die "accounts" noemt (die koppelt het accountid aan een companyid) en een table die "companies" noemt (die koppelt een companyid aan een bedrijfsnaam die uiteindelijk in die mysql result terecht moet komen).

Het probleem zit hem dus bij het feit dat ik twee companynames moet hebben in een query -- eentje die origineel van fromaccountid komt en eentje die van toaccountid komt. Hoe doe ik dit? Uiteraard moet dit kunnen met twee queries maar hoe krijg ik die resultaten daarna ineen gefrot? Ik heb een functie die van een mysql result een mooie tabel maakt met zebra stripes, en daar wil ik liefst zo veel mogelijk afblijven (die wordt in een hoop andere opvragingen gebruikt om het resultaat te formatteren)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je hebt een JOIN nodig, dan kan twee of meerdere SQL tabellen aan elkaar koppelen.

Uit de FAQ:
P&W FAQ - SQL

http://www.w3schools.com/sql/sql_join.asp

[ Voor 24% gewijzigd door LuCarD op 27-02-2006 15:44 ]

Programmer - an organism that turns coffee into software.


  • lvh
  • Registratie: Juli 2001
  • Laatst online: 02-11-2022
LuCarD schreef op maandag 27 februari 2006 @ 15:43:
Je hebt een JOIN nodig, dan kan twee of meerdere SQL tabellen aan elkaar koppelen.

Uit de FAQ:
P&W FAQ - SQL

http://www.w3schools.com/sql/sql_join.asp
Uiteraard heb je een join nodig om bijvoorbeeld een company name aan een companyid te hangen, maar hoe werkt dat dan met twee companynames die geSELECT moeten worden maar die wel andere data bevatten (het bedrijf waarvan het geld komt en waarnaar het gaat is uiteraard nooit hetzelfde)?

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:21

Reinier

\o/

racoontje schreef op maandag 27 februari 2006 @ 16:04:
[...]

Uiteraard heb je een join nodig om bijvoorbeeld een company name aan een companyid te hangen, maar hoe werkt dat dan met twee companynames die geSELECT moeten worden maar die wel andere data bevatten (het bedrijf waarvan het geld komt en waarnaar het gaat is uiteraard nooit hetzelfde)?
Gewoon, de company tabel tweemaal joinen op je transactietabel, toch?

  • lvh
  • Registratie: Juli 2001
  • Laatst online: 02-11-2022
Ik moet twee companynames terug hebben, dus dat moet vlak na SELECT. Mijn probleem is: hoe vertel ik MySQL wat de eerste companyname moet worden en wat de tweede moet worden?

Verwijderd

racoontje schreef op maandag 27 februari 2006 @ 16:15:
Ik moet twee companynames terug hebben, dus dat moet vlak na SELECT. Mijn probleem is: hoe vertel ik MySQL wat de eerste companyname moet worden en wat de tweede moet worden?
Heb je uberhaubt al gekeken wat joins zijn, hoe ze werken en wat ze kunnen? Heb je al wat getest bijvoorbeeld? Dan kom je er namelijk achter dat joins exact zijn wat je nodig hebt.

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:21

Reinier

\o/

racoontje schreef op maandag 27 februari 2006 @ 16:15:
Ik moet twee companynames terug hebben, dus dat moet vlak na SELECT. Mijn probleem is: hoe vertel ik MySQL wat de eerste companyname moet worden en wat de tweede moet worden?
Je kan de tabellen een alias geven in je query:

SQL:
1
2
3
4
SELECT x.companyname , y.companyname , t.bedrag
FROM transacties t
INNER JOIN companies x ON t.fromCompanyID = x.id
INNER JOIN companies y ON t.toCompanyID = y.id

Zoiets dus, alleen zit de accounttabel er in jou geval nog tussen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08-04 12:03

Janoz

Moderator Devschuur®

!litemod

Het probleem heeft helemaal niks te maken met het wel of niet gebruiken van joins, maar met het benoemen van 2x dezelfde tabel.

met AS kun je een alias opgeven voor een tabel en voor een kolom. In je join doe je dan company AS fromCompany en company AS toCompany en in je kolomen lijst doe je iets als fromCompany.name AS fromName etc.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Dan krijg je toch zoiets als:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
 *, 
 ( 
  SELECT name 
  FROM companies 
  WHERE company_id = fromaccountid 
 ) AS from_company, 
 ( 
  SELECT name 
  FROM companies 
  WHERE company_id = toaccountid 
 ) AS to_company 
FROM etc.etc.


Dat is in ieder geval het eerste wat in mij opkomt. Een andere mogelijkheid is natuurlijk joinen zoals al eerder genoemd. Welke de beste oplossing is durf ik niet te zeggen naar aanleiding van je verhaal.

edit:

Tss, snelle reacties allemaal ;)

[ Voor 6% gewijzigd door UltimateB op 27-02-2006 16:24 ]

"True skill is when luck becomes a habit"
SWIS


  • lvh
  • Registratie: Juli 2001
  • Laatst online: 02-11-2022
Janoz schreef op maandag 27 februari 2006 @ 16:23:
Het probleem heeft helemaal niks te maken met het wel of niet gebruiken van joins, maar met het benoemen van 2x dezelfde tabel.

met AS kun je een alias opgeven voor een tabel en voor een kolom. In je join doe je dan company AS fromCompany en company AS toCompany en in je kolomen lijst doe je iets als fromCompany.name AS fromName etc.
Dank je, ik begon me al serieus dom te voelen omdat ik absoluut niet inzag hoe een join mijn probleem kom oplossen.

  • lvh
  • Registratie: Juli 2001
  • Laatst online: 02-11-2022
Wel, het lijkt er al een beetje op, maar ik krijg dit terug:
Afbeeldingslocatie: http://picserver.student.utwente.nl/view_image.php/F0O0GLO7NFF4
Ik heb de transactionid er vanvoor bijgezet zodanig dat je duidelijk ziet dat het wel degelijk over 1 transactie gaat.

Het lijkt wel alsof MySQL denkt dat het drie SELECTs zijn ipv 1 SELECT met een beetje speciale arguments.

Ik denk niet dat iemand het per se wilt hebben (het is zooo ongelofelijk simpel), maar moest het zo zijn, het volgende stukje code is vanaf nu public domain. Het zorgt ervoor dat die mysql_result vertaald woord in zebra-striped tables.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?
function tablesetup($mysql_result){
   /* Make some rows */
   while($row = mysql_fetch_row($mysql_result)) {
      $m++;
      if(is_int($m/2)){
        $currentStyle="marked";
      }
      else{
        $currentStyle="plain";
      }

      echo('<tr class="'.$currentStyle.'">');

      /* Make some columns */
      $numcols=count($row);
      $i=0;
      while($i<$numcols){
         echo("<td>");
         echo($row[$i]);
         echo("</td>");

         $i++;
      }

   echo("</tr>");
   }
}
?>

[ Voor 12% gewijzigd door lvh op 27-02-2006 19:47 ]

Pagina: 1