Avatar billede kgp43 Nybegynder
29. juli 2004 - 12:37 Der er 33 kommentarer og
1 løsning

Hvordan opretter jeg flere quries i den samme?

Hejsa,

Dette spørgsmål er oprettet, da jeg ikke fik en løsning på mit gamle spørgsmål (der er en uge gammel). Mener der er tilladt at oprettet et nyt, hvis det gamle spørgsmål er 1 uge gammelt.

Problemet er at min side loader for langsom (pga alle de seperate db queries):
http://www.tackleprices.com/products/fishing-reels/series.php

Det gamle spørgsmål (med en masse info) kan ses her:
http://www.eksperten.dk/spm/522465
Avatar billede kgp43 Nybegynder
29. juli 2004 - 12:41 #1
Fik lavet følgende:

$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)) {


- Men den kommer med 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
29. juli 2004 - 12:42 #2
Avatar billede arne_v Ekspert
29. juli 2004 - 12:42 #3
Den form for subqueries virker ikke i MySQL 3.x og 4.0.x men muligvis godt
i 4.1.x
Avatar billede kgp43 Nybegynder
29. juli 2004 - 12:43 #4
En lille rettelse, men stadig samme fejl.

$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
29. juli 2004 - 12:43 #5
arne_v; har du et andet forslag?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 12:45 #6
Har også prøvet følgene, men der sker intet (intet output, men heller ingen fejl):

$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.brand DESC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {
Avatar billede razor Nybegynder
29. juli 2004 - 12:55 #7
Avatar billede kgp43 Nybegynder
29. juli 2004 - 16:30 #8
razor; Der står følgende i dit link:

"
The queries:

SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2);
SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);

Can be rewritten as:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
                                      WHERE table2.id IS NULL;
"

Er det ikke allerede det jeg har prøvet på:
$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.brand DESC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:00 #9
der er ingen der kan se problemet?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:16 #10
Jeg har opdelt den lidt (og rettet nogle få fejl):

$query = mysql_query("SELECT brand.id as brand_id,series.id as series_id,products.id as product_id
FROM brand
JOIN series,products,prices
ON series.brand_id=brand.id,products.series_id=series.id,prices.product_id=products.id
WHERE products.type='reels'
ORDER BY brand.brand DESC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {

- Det ser ud til den går galt efter "ON series.brand_id=brand.id......... etc"

Får også 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 '.id WHERE products.type='reels' ORDER BY brand.brand DESC' at l
Avatar billede arne_v Ekspert
29. juli 2004 - 21:18 #11
ON adskille rmed AND ikke med komma.

Så du kan jo starte med at prøve:

ON series.brand_id=brand.id AND products.series_id=series.id AND prices.product_id=products.id
Avatar billede arne_v Ekspert
29. juli 2004 - 21:19 #12
Normal vil man også bruge:

FROM ((brand JOIN series ON series.brand_id=brand.id)
    JOIN products ON products.series_id=series.id)
    JOIN prices ON prices.product_id=products.id
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:21 #13
okay, det virkere (sådan da). Den kommer ikke med nogen fejl, men er mærkeligt output:
http://www.tackleprices.com/products/fishing-reels/series2.php
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:24 #14
Dit forslag ser også mere overskueligt ud :)
Ændrede det, men får stadig et undeligt output:

$query = mysql_query("SELECT brand.id as brand_id,series.id as series_id,products.id as product_id
FROM ((brand JOIN series ON series.brand_id=brand.id)
    JOIN products ON products.series_id=series.id)
    JOIN prices ON prices.product_id=products.id
WHERE products.type='reels'
ORDER BY brand.brand DESC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {


- Prøver lige at kigge den igennem igen, kunne jo være jeg havde overset noget.
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:29 #15
Okay, det ser lovende ud.

Den lavet et "okay output". Problemet er bare at den opretter en tabel for hver serie (hvor den kun skal oprette én tabel for hvert brand).
Avatar billede arne_v Ekspert
29. juli 2004 - 21:31 #16
Er det ikke et PHP problem ?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:37 #17
hvordan det? er det ikke mysql delen der er bygget forkert op?
Avatar billede arne_v Ekspert
29. juli 2004 - 21:38 #18
Det er vel ikke SQL'en der opretter tabeller ? Det må vel være PHP kode !
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:48 #19
er det ikke et mysql problem at tabellen bliver oprettet for hver serie, i stedet for hvert brand?
Avatar billede arne_v Ekspert
29. juli 2004 - 21:50 #20
En SELECT statement opretter ikke nogen SQL tabeller og heller ikke nogen HTML tabeller.

En SELECT statement returnerer et result set som ligner en tabel.

PHP koden viser så det resultset i noget HTML f.eks. en HTML tabel.
Avatar billede kgp43 Nybegynder
29. juli 2004 - 21:58 #21
Jeg er lost.

Kan sagtent flytte den sidste halvdel over i php gruppen, men er temmelig forvirret nu (det virker ikke logisk).

Jeg kan ændre tabellen (eller andet output) med php, men tabellen bliver stadig oprettet på det forkerte tidspunt (for hver series eller price i stedet for brand). Så det må da være en fejl i database forespørgslen, ik?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 22:02 #22
den opretter tabellen for hver pris og ikke series.
Avatar billede kgp43 Nybegynder
29. juli 2004 - 22:33 #23
Jeg smed noget php på, så den ikke opretter den samme tabel to gange.


$query = mysql_query("SELECT brand.id as brand_id,brand.brand as brand_name,series.id as series_id,products.id as product_id
FROM ((brand JOIN series ON series.brand_id=brand.id)
    JOIN products ON products.series_id=series.id)
    JOIN prices ON prices.product_id=products.id
WHERE products.type='reels'
    AND brand.validation_status='1'
    AND series.type='Reels'
    AND series.validation_status='1'
ORDER BY brand.brand ASC") or die (mysql_error());
while($fetch = mysql_fetch_array($query)) {

    if ($brand_while_check == 0) {
?>

...... opret tabel og andet.

<?
    }
    $brand_while_check++;
}
unset($brand_while_check);
?>



- Men jeg får ikke nogen hastigheds forøgelse (bliver markant langsommere for hver pris der bliver tilføjet databasen). Er det ikke muligt at ændre forespørgslen, så while løkken kun køres igennem på brands og ikke på prices?
Avatar billede kgp43 Nybegynder
29. juli 2004 - 23:15 #24
er der en der kan fortælle hvorfor denne query ikke virker:

$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)) {

- Den virker meget mere logisk og burde gøre det jeg søger. Er meget i tvivl om den anden overhovedet kommer til at virke (til det jeg skal anvende den til). Laver den ikke bare et output hvis alle JOIN er aktive?
Avatar billede arne_v Ekspert
29. juli 2004 - 23:17 #25
Som jeg skrev 12:42:40 virker ...EXISTS(SELECT... ikke i MySQL versioner før 4.1
Avatar billede kgp43 Nybegynder
29. juli 2004 - 23:22 #26
Troede jeg anvendte den nyeste mysql (eller er 4.1 ikke udkommet endnu?)
MySQL version: 4.0.20-standard
Avatar billede arne_v Ekspert
29. juli 2004 - 23:24 #27
4.0.20 er nyeste i production kvalitet.

4.1.x er kun i beta endnu.
Avatar billede kgp43 Nybegynder
29. juli 2004 - 23:28 #28
Du skulle vel ikke vide hvor stabil 4.13 er? Overvejer næsten at opgradere for at løse problemet og så tage de bugs med der skulle komme (kan ikke se andre løsninger).
Avatar billede arne_v Ekspert
29. juli 2004 - 23:30 #29
Jeg tror faktisk ikke at den er så dårlig endda. Den har været i beta
i meget lang tid.
Avatar billede arne_v Ekspert
29. juli 2004 - 23:32 #30
Avatar billede kgp43 Nybegynder
29. juli 2004 - 23:37 #31
Jeg kontakter lige min "server administration... dims og ser hvad han syntes om det (om han har oplevet nogle problemer).

Vender tilbage senere :)
Avatar billede kgp43 Nybegynder
01. august 2004 - 10:46 #32
Jeg har netop fået opgraderet min mysql til 4.13 beta :)

Men mit output ser ikke rigtigt ud:
(skal se sådan ud) http://www.tackleprices.com/products/fishing-reels/series.php
(ser sådan ud på min test side) http://www.tackleprices.com/products/fishing-reels/series2.php


Mine kode:
$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
01. august 2004 - 16:47 #33
er opsætningen af løkken rigtig?
Avatar billede kgp43 Nybegynder
09. august 2004 - 13:40 #34
Har flyttet spørgsmålet over i en ny tråd, da denne døde ud.
http://www.eksperten.dk/spm/527593
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