Hov. Du er ikke logget ind.
DU SKAL VÆRE LOGGET IND, FOR AT INTERAGERE PÅ DENNE SIDE

Mysql guru?

Side 1 ud af 2 (11 indlæg)
Tilmeldt 20. Apr 07
Indlæg ialt: 16014
30% af profil udfyldt
Skrevet kl. 12:01
Hvor mange stjerner giver du? :

Hvem skal man have fat i med seriøse mysql querys og problemer?

Sagen er den at vores produkt søgning er blevet for langsom efter jeg har udvidet den til at søge i en masse flere data. Derfor er jeg ved at skrive en helt ny sql streng.

Mit problem er at jeg LEFT JOIN'er products_collection til products, men det felt den gør det "ON" er i den ene tabel et VARCHAR og i den anden INT, hvilket ikke kan lave om (Forklaring følger).

Det er denne linje der er problemet:

products_collection as pc ON p.collection_id = pc.id

p.collection_id indeholder et varenummer (tal, bogstaver og -'er), med mindre det er en vare som har ekstra data fra products_collection. Hvis den har ekstra data indeholder feltet kun INT og dermed kan de to tabeller pares.

Spørgsmålet er nu om der skal lave en eller anden form for if, som tjekker om p.collection_id er en INT inden der bliver lavet en LEFT JOIN eller om man kan tvinge min "ON" i den pågældende linje til at sammenligne som VARCHAR.

Et eksempel på problem stillingen er:

1. Varenummer: 01-53022017 (Uden ekstra data og derved indeholder p.collection_id varenummeret (01-53022017)).

2. Varenummer: 054E-SR221XX (Med ekstra data i products_collection, hvor dataen har pc.id = 1 og p.collection_id indeholder 1).

Når man så søger efter navnet på vare 2, så finder den også vare 1.

Håber nogen forstår mit volapyk og evt. ved hvem man skal have fat på.

Hele min QUERY:

SELECT
    p.products_id,
    pd.products_name,
    pd.products_description_1,
    pd.products_description_2,
    pd.products_description_3,
    pc.products_id AS pc_products_id,
    pc.products_name AS pc_products_name,
    pc.products_description
   
FROM
    products AS p
   
    JOIN
        products_description AS pd ON p.products_id = pd.products_id
   
    LEFT JOIN
        products_collection as pc ON p.collection_id = pc.id
       
    LEFT JOIN
        specification_values as sv ON p.products_id = sv.products_id
   
WHERE
        p.products_status = 1
    AND
        pd.language_id = 4       
    AND
    (
            p.products_id LIKE '%".$keyword."%'
        OR
            pd.products_name LIKE '%".$keyword."%'
        OR
            pd.products_description_1 LIKE '%".$keyword."%'
        OR
            pd.products_description_2 LIKE '%".$keyword."%'
        OR
            pd.products_description_3 LIKE '%".$keyword."%'
        OR
            pc.products_id LIKE '%".$keyword."%'
        OR
            pc.products_name LIKE '%".$keyword."%'
        OR
            pc.products_description LIKE '%".$keyword."%'
        OR
            sv.value LIKE '%".$keyword."%'
    )
       
GROUP BY
    p.collection_id

Fra Århus
Tilmeldt 18. Feb 06
Indlæg ialt: 4322
Skrevet kl. 12:03
Hvor mange stjerner giver du? :

Har du indexes på alle de ting du søger i?

Hvis ikke, så kan du med fordel starte med at få styr på det.

Safeticket - Dit enkle og fleksible billetsystem.

Tilmeldt 20. Apr 07
Indlæg ialt: 16014
30% af profil udfyldt
Skrevet kl. 12:17
Hvor mange stjerner giver du? :

Der er index på alle int og varcar felter som bliver brugt i søgning. Som jeg har forstået det giver det ingen mening på text felter.

Men har det noget at gøre med problemet i queryen?

Fra Helsingborg
Tilmeldt 3. Apr 05
Indlæg ialt: 6570
Fra  TextReactor Skrevet kl. 12:51
Hvor mange stjerner giver du? :

Problemet er alle de LIKES du har. Det tager tid at søge dem igennem.

Det du evt. kunne gøre som vil tage lidt tid i starten er at lave en tabel kun med et tekstfelt, således at du ikke har alle de LIKES men kan nøjes med en. Det betyder også at der vil være flere rækker at søge igennem, men det kunne være en mulighed.

 

Jeg har programmeret i over 27 år. Jeg har kodet i C, C++, Java, Delphi, Perl, JavaScript, C#, F#, VB.NET, ASP, Myresnak :D, Comal80 osv....

Tilmeldt 20. Apr 07
Indlæg ialt: 16014
30% af profil udfyldt
Skrevet kl. 12:57
Hvor mange stjerner giver du? :

hej Niels

 

Den query jeg har postet her på amino tager under 0,5 sek at udfører så den er der ingen problemer med. Det er ikke muligt at lægge alt data sammen.

Det jeg egentligt søger hjælp til at den fejl jeg oplever med at mysql tolker et VARCHAR som INT i min ON statement og derved laver varenummer 01-53022017 om til 1, da en den sletter alt efter -'en og en INT ikke kan have nuller først.

Fra Lamplaimat, Thailand
Tilmeldt 25. Oct 09
Indlæg ialt: 218
Fra  CS-WEB Skrevet kl. 13:27
Hvor mange stjerner giver du? :

JOIN
        products_description AS pd ON CAST(p.products_id as CHAR) =  CAST(pd.products_id as CHAR)

 

Vil jeg mene løser det problem

 

Claus

 

Tilmeldt 4. Jun 09
Indlæg ialt: 35
Skrevet kl. 13:28
Hvor mange stjerner giver du? :

Nu har jeg ikke den store erfaring med MySQL, men kan du ikke caste din int til en char, således at du eks. får:
"ON p.collection_id = CAST(pc.id AS CHAR)"

Tilmeldt 20. Apr 07
Indlæg ialt: 16014
30% af profil udfyldt
Skrevet kl. 13:51
Hvor mange stjerner giver du? :

Claus Nielsen:

JOIN
        products_description AS pd ON CAST(p.products_id as CHAR) =  CAST(pd.products_id as CHAR)

 

Vil jeg mene løser det problem

 

Claus

ReneNP:

Nu har jeg ikke den store erfaring med MySQL, men kan du ikke caste din int til en char, således at du eks. får:
"ON p.collection_id = CAST(pc.id AS CHAR)"

Jeg har ikke lige prøvet med CAST, men er faldet over den et par gange uden helt at forstå den.

Dog ser det ud til at jeg har fundet en løsning i nedenstående linje. Hvad så forskellen mellem CONCAT og CAST er, har jeg ikke lige læst op på.

products_collection as pc ON p.collection_id = concat('', 0 + pc.id)

Fra Dyssegård
Tilmeldt 21. Jan 09
Indlæg ialt: 181
Skrevet kl. 14:21
Hvor mange stjerner giver du? :

Kender ikke MySQL så specifikt , men vil tro at din CONCAT laver en implicit datatype konvertering til CHAR.. altså laver feltet om til CHAR i det din CONCAT's primære funktion er at sammentætte 2 strenge... til een streng.

CAST er en explicit datatype konvertering, hvor du styrer hvilken datatype du ønsker feltet skal "optræde" som...

Hmm... håber det giver mening.. og MySQL-guru'er... korrex mig hvis det helt i skoven.

/almulimann

Tilmeldt 26. Mar 09
Indlæg ialt: 964
Skrevet kl. 14:33
Hvor mange stjerner giver du? :

WooX:

Jeg har ikke lige prøvet med CAST, men er faldet over den et par gange uden helt at forstå den.

Dog ser det ud til at jeg har fundet en løsning i nedenstående linje. Hvad så forskellen mellem CONCAT og CAST er, har jeg ikke lige læst op på.

products_collection as pc ON p.collection_id = concat('', 0 + pc.id)

CONCAT sætter to strenge sammen. (CONCAT -> concatenate)

CAST fortæller at en given variabel skal opfattes som en given datatype

Dvs. at        CAST(pc.id AS CHAR) siger at pc.id altid skal opfattes som en CHAR-type

mvh

Jan

Side 1 ud af 2 (11 indlæg)