SQL commando in php werkt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Patrick cos

patrick cos

05/06/2013 16:09:43
Quote Anchor link
Ik wil graag uit 2 tabellen van de database gegevens halen voor een zoekfuntie.
Maar het onderstaande commando werkt helemaal, heeft iemand enig idee?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
    $zoekquery =
        "SELECT DISTINCT
           od_id,
           od_naam,
           od_prijs,
           system_auto_id,
           system_naam,
           system_prijs  
         FROM
           onderdelen,
           systemen
         WHERE
                ((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
                AND
                od_removed = 'N' AND
                od_show = 'Y')
            OR
                ((LOWER(system_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
                AND
                system_removed = 'N' AND
                system_show = 'Y')
         ORDER BY
            od_id, system_auto_id
         DESC
        ";
 
PHP hulp

PHP hulp

14/05/2024 06:35:46
 
Erwin H

Erwin H

05/06/2013 16:27:23
Quote Anchor link
Wat werkt er niet? Zo is het een beetje de speld in de hooiberg vinden. Dus wat krijg je eruit en wat had je verwacht (of gewild) eruit te krijgen?
 
Patrick cos

patrick cos

05/06/2013 16:42:21
Quote Anchor link
Ja sorry,

Het script geeft wel output, maar geeft dezelfde rij 100+ * weer waar het zoekwoord in voorkomt.
Daarnaast worden de overige producten waarin het zoekterm niet in voorkwam 1x weergegeven (met andere worden alle producten).

product a
product a
product a
product a
product a
Etc....
product b
product b
Etc....



Toevoeging op 05/06/2013 16:43:31:

Patrick cos op 05/06/2013 16:42:21:
Ja sorry,

Het script geeft wel output, maar geeft dezelfde rij 100+ * weer waar het zoekwoord in voorkomt.
Daarnaast worden de overige producten waarin het zoekterm niet in voorkwam 1x weergegeven (met andere worden alle producten).

product a
product a
product a
product a
product a
Etc....
product b
product b
Etc....




Nog iets:

Toen ik het onderstaande gebruikte voor alleen de onderdelen werkte het script wel goed, maar sinds ik systemen toegevoegd heb niet meer.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
                ((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
                AND
                od_removed = 'N' AND
                od_show = 'Y')
Gewijzigd op 05/06/2013 16:44:09 door patrick cos
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/06/2013 16:55:55
Quote Anchor link
Dit kan natuurlijk nooit.
Dat is het nadeel van impliciete joins, je vergeet heel makkelijk de join condities, dus je moet altijd een
onderdelen.systeem_id = systemen.systeem_id
in je where hebben staan, anders heb je een cross join, en dat wil zeggen dat elke rij in tabel A aan alle rijen in tabel B wordt gekoppeld.
Gewijzigd op 05/06/2013 16:56:47 door Ger van Steenderen
 
Patrick cos

patrick cos

05/06/2013 17:03:37
Quote Anchor link
Oke, maar het zijn namelijk wel 2 afzondelijke tabellen zeg maar die niet aan elkaar gerelateerd zijn.
Hoe zou ik dat in deze query moeten verwerken?
 
Erwin H

Erwin H

05/06/2013 17:07:55
Quote Anchor link
Dan kan je beter een UNION gebruiken. Dus selecteer eerst alle rijen van de een, dan van de ander en voeg ze samen met een UNION. Daarop kan je dan eventueel nog een sorteer actie uitvoeren.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/06/2013 17:19:59
Quote Anchor link
Dan zou je dit opslitsen in twee query's en met union aan elkaar knopen.
Maar beter kan je de database opzet veranderen, kortom ervoor zorgen dat die twee tabellen wel een relatie krijgen.
Als voorbeeld:
Een systeem heeft meerdere onderdelen, en een onderdeel kan ook in meerdere sytemen voorkomen.
Dit is een meer - meer relatie, dus dan heb je ALTIJD een extra tabel nodig.
 
Patrick cos

patrick cos

06/06/2013 21:30:59
Quote Anchor link
Union werkt goed, wist niet dat het op die manier kon, bedankt!

Voor de rest werkt het systeem gewoon goed, maar de onderdelen kunnen wel in systemen geplaatst worden...?
Hoe is het bijvoorbeeld mogelijk om op prijs of prijs te sorteren, waarbij de gebruiker dit kan bepalen?

Alvast bedankt!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2013 11:30:39
Quote Anchor link
Ja dat kan, je maakt een select in je formulier en de waarde van de select bepaald de sorteer volgorde.
Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function setOrderBy($order) {
        if ($order !== 0) {
            if ($order == 1 || $order == 2) {
                $this->_order_by = 'b.brand_name';
                $this->_order_by .= ($order == 2) ? ' DESC' : '';
            }

            if ($order == 3 || $order == 4) {
                $this->_order_by = 'p.product_new_price';
                $this->_order_by .= ($order == 4) ? ' DESC' : '';
            }

            $this->_order_by .= ', p.product_id DESC';
        }
    }

?>
 
Patrick cos

patrick cos

07/06/2013 11:52:40
Quote Anchor link
Hoe moet ik dit dan terug refereren maar sql code?

Ik nog niet niet echt zo gevorderd met php en sql (ik ben meer van de Python, etc..)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2013 12:13:59
Quote Anchor link
Aan het eind van de query (maar voor een eventuele LIMIT) ORDER BY kolom1 (ASC of DESC), kolom2 (ASC of DESC) toevoegen.
ASC is oplopend, dat is de default dus mag je weglaten, DESC is aflopend.
Dus bv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT kolom1, kolom2, kolom3
FROM tabel
WHERE kolom2 > 13
ORDER BY kolom2, kolom1 DESC
 
Patrick cos

patrick cos

07/06/2013 14:09:46
Quote Anchor link
Als ik ORDER BY system_prijs DESC krijg ik een foutmelding 'Unknown column 'system_prijs' in 'order clause'
maar deze staat er toch echt wel bij?

Hoe kan ik dit het beste oplossen?
Zodat er op naam, prijs en indien mogelijk op onderdelen of systemen alleen gezocht kan worden...


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
30
31
    $zoekquery =
        "SELECT DISTINCT
           od_id,
           od_naam,
           od_prijs
         FROM
           onderdelen

         WHERE
                ((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
                AND
                od_removed = 'N' AND
                od_show = 'Y')
        
        UNION
    
        SELECT DISTINCT
           system_auto_id,
           system_naam,
           system_prijs  
         FROM
           systemen
         WHERE
                ((LOWER(system_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
                AND
                system_removed = 'N' AND
                system_show = 'Y')
        ORDER BY
                system_prijs DESC
        LIMIT 100
        ";




Toevoeging op 07/06/2013 14:14:23:

maar op od_prijs kan ik raar genoeg wel sorteren

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
                system_show = 'Y')
        ORDER BY
                od_prijs DESC
        LIMIT 100
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2013 15:51:11
Quote Anchor link
Dat is niet vreemd, het uiteindelijke resultaat van de union heeft de kolomnamen van de eerste select statement.
 
Patrick cos

patrick cos

07/06/2013 16:10:27
Quote Anchor link
Oh okej, nu heb de id van systemen boven geplaats onder ondelen en dan krijg ik not correct use of UNION
 
Erwin H

Erwin H

07/06/2013 16:21:28
Quote Anchor link
Nee, nee, dat moet je helemaal niet doen.
Wat je krijgt als je een union gebruikt is dat de kolomnamen zoals in de eerste query gegeven de kolomnamen worden voor de hele resultset. Je kan immers niet dezelfde kolom eerst met de ene naam en vervolgens met een andere naam hebben. In jouw geval krijg je dus od_id, od_naam en od_prijs als namen. In je order by kun je dus alleen die kolommen gebruiken. Wat je eventueel nog wel kan doen (regelmatig handig), is een extra virtuele kolom opnemen waaruit je later nog kan afleiden wat voor record je hebt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
         SELECT DISTINCT
           od_id,
           od_naam,
           od_prijs,
           'onderdeel' AS record_type
...
UNION
         SELECT DISTINCT
           system_auto_id,
           system_naam,
           system_prijs,
           'system'
...

Zo weet je dus als je de rijen aan het uitlezen bent of het id van een onderdeel is, of van een system. Hier kan je dan ook nog op sorteren.
Gewijzigd op 07/06/2013 16:22:05 door Erwin H
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2013 16:22:27
Quote Anchor link
Dat kan dus niet, de SELECT statements in UNION moeten hetzelfde aantal kolommen hebben.
En om je volgende vraag voor te zijn, om te kunnen bepalen of het een systeem of een onderdeel is, voeg je een literal toe aan de SELECT, dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    'onderdeel' AS soort,
    od_id,
    .....
FROM
    onderdelen
....
SELECT
    'systeem' AS soort,
    system_id,
    .....
FROM
    systemen
....
Gewijzigd op 07/06/2013 16:23:49 door Ger van Steenderen
 
Erwin H

Erwin H

07/06/2013 16:37:50
Quote Anchor link
Gelukkig hebben we nog steeds elke keer dezelfde tips :-)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2013 16:49:53
Quote Anchor link
Lol, inderdaad ja, je was me weer eens net voor ;-)

Toevoeging op 07/06/2013 17:01:00:

PS.
SELECT DISTINCT hoeft niet, de DISTINCT zit al in de UNION
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.