Avatar billede kgp43 Nybegynder
09. august 2004 - 13:39 Der er 17 kommentarer og
1 løsning

multi query

Hejsa,

Lukkede det andet spørgsmål, da der ikke var nogen aktivitet.
Har prøvet forskellige ting over de sidste 3 uger, men har ikke kunne finde fejlen. Har samtidig fået opgraderet mysql til 4.13 beta, for at benytte den nye form for queries, men har heller ikke kunne få dét til at virke. Håber på at finde en løsning, da jeg ikke kan udvikle videre før en løsning er fundet.

Tidligere threads:
http://www.eksperten.dk/spm/524421
http://www.eksperten.dk/spm/522465

Test side: http://www.tackleprices.com/products/fishing-reels/series2.php
Nuværende site (working): http://www.tackleprices.com/products/fishing-reels/series.php


kode:

$query = mysql_query("SELECT brand.id
FROM brand
WHERE status='1'
AND validation_status='1'
  AND exists(SELECT * FROM series
  WHERE brand_id=brand.id
    AND type='Reels'
    AND 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)) {

<table>
  <tr>
    <td><a href="http://<? echo $fetch[brand_link];?>" target="_blank"><h2><? echo $fetch[brand];?></h2></a></td>
  </tr>
</table>
}

Får forresten 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 '} } } ORDER BY brand.brand' at line 15


Hvis der er nogle der er interreseret i den gammle query:
//Select all active brands ordered 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.
$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)) {

/*
Check if there is any active prices based on the active products (again based on active series and brands).
To do this we query all active products based on active series.
For each product we check if it has any related prices.
We use $no to make sure we only create ONE table for each brand, otherwise the query will create
a new table for each product.
*/
unset($no);
$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)) {

$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) && ($no != 1) && ($serie_no != 1)) {

$serie_no = 1;
$no = 1;
$i = 0;
Avatar billede erikjacobsen Ekspert
09. august 2004 - 13:51 #1
Jeg kan ikke gennemskue din query, men starter du med ( skal du slutte med ) og ikke }
Avatar billede coderdk Praktikant
09. august 2004 - 13:59 #2
Umiddelbart ser det ikke ud som om at det er nødvendigt at lave subselects (og dermed ikke nødvendigt at køre en beta).
Prøv at se om denne ikke gør det samme:

SELECT
    b.id
FROM
    brand b
INNER JOIN
    series s
ON
    b.id = s.brand_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    products p
ON
    s.id = p.series_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    prices pr
ON
    p.id = pr.product_id
WHERE
    b.status='1'
    AND b.validation_status='1'
ORDER BY
    b.brand
   
Er ikke helt 100% på at jeg har skrevet feltnavnene ordentligt (altså med den rigtige tabel på).
Avatar billede kgp43 Nybegynder
09. august 2004 - 14:19 #3
Den laver et output for hver pris der er listet i db'en, hvor den kun skal lave ét for hvert aktivt brand. Et aktivt brand:

- validation_status skal have værdien '1' (for brand)
- Brand'et skal have aktive series listet (series.validation_status='1')
- Der skal være produkter tilføjet serierne
- Der skal være priser tilføjet produktet(eller produkterne)

Hpber det gav lidt forklaring, ellers må i bede mig om at uddybe mig bedre :P
Avatar billede coderdk Praktikant
09. august 2004 - 14:22 #4
Hvad med blot at tilføje en distinct?

SELECT
    DISTINCT( b.id )
FROM
    brand b
INNER JOIN
    series s
ON
    b.id = s.brand_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    products p
ON
    s.id = p.series_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    prices pr
ON
    p.id = pr.product_id
WHERE
    b.status='1'
    AND b.validation_status='1'
ORDER BY
    b.brand
Avatar billede kgp43 Nybegynder
09. august 2004 - 14:40 #5
Perfekt!
Den laver 16 outputs (hvilket er det samme som den "rigtige" side).

Den vil dog ikke skrive navnet på mit brand:
<table>
  <tr>
    <td><? echo $fetch[brand];?></td>
  </tr>
</table>
Avatar billede coderdk Praktikant
09. august 2004 - 14:43 #6
Ah:

SELECT
    DISTINCT( b.id )
    ,b.brand
FROM
    brand b
INNER JOIN
    series s
ON
    b.id = s.brand_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    products p
ON
    s.id = p.series_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    prices pr
ON
    p.id = pr.product_id
WHERE
    b.status='1'
    AND b.validation_status='1'
ORDER BY
    b.brand
Avatar billede coderdk Praktikant
09. august 2004 - 14:44 #7
Så vidt jeg lige kan se kan den faktisk forkortes lidt:

SELECT
    DISTINCT( b.id )
    ,b.brand
FROM
    brand b
INNER JOIN
    series s
ON
    b.id = s.brand_id
    AND s.type = 'Reels'
    AND s.validation_status = '1'
INNER JOIN
    products p
ON
    s.id = p.series_id
INNER JOIN
    prices pr
ON
    p.id = pr.product_id
WHERE
    b.status='1'
    AND b.validation_status='1'
ORDER BY
    b.brand
Avatar billede kgp43 Nybegynder
09. august 2004 - 14:54 #8
Det virker perfekt :D
Ligger du et svar, så er der point.

Kan ikke forstå at problemet endelig er løst. Hvilken lettelse :D
Avatar billede coderdk Praktikant
09. august 2004 - 14:55 #9
Der skulle gerne være et svar :)
Avatar billede kgp43 Nybegynder
09. august 2004 - 14:56 #10
lol, det gik vist for hurtigt.

Takker endnu engang :)
Avatar billede coderdk Praktikant
09. august 2004 - 14:57 #11
Det var så lidt :) Vær opmærksom på at du, hvis du er nervøs ved beta'en, godt kan nedgradere til en stable version :)
Avatar billede kgp43 Nybegynder
09. august 2004 - 15:00 #12
ahhh, den her query kan kører på den gamle?

Beta'en virker uden problemer så jeg beholder den. Rart at vide jeg kan skifte tilbage til stable, hvis der skulle opstå problemer :)
Avatar billede coderdk Praktikant
09. august 2004 - 15:01 #13
Yeps! Den kan sagtens køre på en stable :) Men ok, jeg tror nu også den beta er ved at være moden, mon ikke? :)
Avatar billede kgp43 Nybegynder
09. august 2004 - 15:09 #14
hehe.
Har ikke haft nogle problemer, men var dog lidt nervøs for at skifte.
Tror nu snart den bliver frigivet i en stable version :)
Avatar billede kgp43 Nybegynder
09. august 2004 - 15:54 #15
hmmm.... hvad gør du hvis du skal have navnet ud på column "5465546" fra tabellen "series"? Fandt ud af hvordan man gør det med brand, men kan ikke lige se hvordan man gør ved series (eller products/prices).
Avatar billede coderdk Praktikant
09. august 2004 - 15:57 #16
SELECT
    DISTINCT( b.id )
    ,b.brand
    ,s.et_felt_fra_series
FROM
  [ osv her ]

Med products er det p.felt_fra_products, prices er pr.felt_fra_prices
Avatar billede kgp43 Nybegynder
09. august 2004 - 15:59 #17
ahhh, det skal bare tilføjes samme sted som brand :)
takker.
Avatar billede coderdk Praktikant
09. august 2004 - 16:05 #18
:) dvsl
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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