Avatar billede kgp43 Nybegynder
23. juli 2004 - 09:49 Der er 7 kommentarer og
1 løsning

Join 4 queries

Okay, dette er et advanceret spørgsmål (hvilket er grunden til de høje point).

Jeg har 4 queries, der er afhængige af resultatet af den forrige, men siden loader ekstremt langsomt (pga dette "system", så jeg har bestemt at lave det om. Desværre er mine mysql færdigheder ikke gode nok (endnu), så jeg håber jeg kan få hjælp herinde.

Jeg har valgt at beskrive løsning/systemet først, da koden er uoverskuelig (koden er dog postet under beskrivelsen/teksten):


1. Jeg har 4 tabeller:
- Brand
- Series
- Products
- Prices

2. Beskrivelse:
Har brug for en query, der laver en tabel hvis disse kriterier er opfyldte:
- Finder alle aktive (status) og godkendte (validation_status) "brand".
- Finder alle aktive/godkendte series (validation_status), der tilhører det enkelte "brand". Dette kan gøres da tabellen har en kolonne med id'et på det tilhørende brand (brand_id)
- Finder alle aktive/godkendte produkter (validation_status), der tilhører den enkelte serie. Dette kan gøres da tabellen har en kolonne med id'et på den tilhørende serie(series_id)
- Søg om der er nogle priser tilføjet tabellen prices, der tilhører det enkelte produkt. Dette kan gøres da tabellen har en kolonne med id'et på det tilhørende produkt (product_id)

For at gøre det kort: Den skal kun oprette tabellen hvis der er lagt priser ind i systemet (det vil sige at vi først skal finde alle aktive brands, herefter alle aktive series baseret på aktive brands, herefter aktive produkter baseret på aktive series, herefter (og sidst) checke om der er lagt en pris på produktet ind i "prices" tabellen. Resultatet skal grupperes efter brand (name), så jeg er nød til at gøre det på denne måde.

Det nuværende system kan ses her (live):
http://www.tackleprices.com/products/fishing-reels/series.php


Den gamle kode (nogle variabler (ved den sidste query) er fjernet):
//Select all active brands (order by brand)
$query = mysql_query("SELECT * FROM brand WHERE status='1' AND validation_status='1' ORDER BY brand") or die (mysql_error());
while($row = mysql_fetch_array($query)) {
unset($serie_no);

//If there are any active series when we select them and sort them by name (series)
$query2 = mysql_query("SELECT * FROM series WHERE brand_id='$row[id]' AND type='Reels' AND validation_status='1' ORDER BY series ") or die (mysql_error());
while($row2 = mysql_fetch_array($query2)) {

  /* Select all active products based on active series. We dont need any "data", just to know if there are
  any active products (based on active series) */
  $query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
  while($row3 = mysql_fetch_array($query3)) {

  //If there is any prices attached to the product, then we create the table
  $sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
  $doublecheck3 = mysql_num_rows($sql_doublecheck3);
  if(doublecheck3 != 0...... flere kriterier fjernet for at gøre det mere overskueligt) {



har fået lavet dette, men der kommer ikke noget output (dog heller ingen feejl), ved heller ikke om det skal gøres på denne måde (brugte noget "gammelt" kode):
$query = mysql_query("SELECT brand.id as brand_id,series.id as series_id,products.id as product_id FROM brands JOIN series,products,prices ON series.brand_id=brand.id,products.id=series.id,prices.product_id=products.id WHERE products.type='reels' ORDER BY brand.date_added DESC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {
Avatar billede Slettet bruger
23. juli 2004 - 20:35 #1
Prøv:

select Brand.ID
from Brand, Series
where Brand.status='1'
and Brand.validation_status='1'
and Series.brand_id=Brand.id
and Series.type='Reels'
and Series.validation_status='1'
and exists(select * from Products
          where series_id=Series.id
            and type='Reels'
            and validation_status='1'
            and exists(select * from Prices
                  where product_id=Products.Id)
          )
order by Brand.Name
Avatar billede kgp43 Nybegynder
23. juli 2004 - 22:57 #2
intet output
Avatar billede kgp43 Nybegynder
23. juli 2004 - 22:58 #3
sådan ser den ud nu:

$query = mysql_query("SELECT brand.id
FROM brand, series
WHERE brand.status='1'
AND brand.validation_status='1'
AND series.brand_id=brand.id
AND series.type='Reels'
AND series.validation_status='1'
AND exists(SELECT * FROM products
          WHERE series_id=series.id
            AND type='Reels'
            AND validation_status='1'
            AND exists(SELECT * FROM prices
                  WHERE product_id=products.id)
          )
ORDER BY brand.name") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {
Avatar billede kgp43 Nybegynder
23. juli 2004 - 23:00 #4
<? echo $fetch[brand];?>
Avatar billede kgp43 Nybegynder
23. juli 2004 - 23:03 #5
hovsa... navnet på brand hedder ikke "name" men derimod også "brand".

- Har rette det, men stadig intet output:

$query = mysql_query("SELECT brand.id
FROM brand, series
WHERE brand.status='1'
AND brand.validation_status='1'
AND series.brand_id=brand.id
AND series.type='Reels'
AND series.validation_status='1'
AND exists(SELECT * FROM products
          WHERE series_id=series.id
            AND type='Reels'
            AND validation_status='1'
            AND exists(SELECT * FROM prices
                  WHERE product_id=products.id)
          )
ORDER BY brand.brand") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {
Avatar billede kgp43 Nybegynder
23. juli 2004 - 23:24 #6
damn, det er ikke min dag :P
Havde givet min test side et navn, så den konkliktede med .htaccess (mod_rewrite). Hvilket vil sige at jeg ikke kunne se resultatet af mine tests :P

Nå, jeg har fået det rettet og får denne fejl:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'exists(SELECT * FROM products WHERE series_id=series.
Avatar billede kgp43 Nybegynder
26. juli 2004 - 23:08 #7
andre forslag?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 12:38 #8
nyt spørgsmål oprettet:
http://www.eksperten.dk/spm/524421
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
Computerworld tilbyder specialiserede kurser i database-management

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