SELECT * FROM t1 WHERE t1.a IN (felsorolás)
Ha a "
felsorolás"-t magam viszem be (php, dump, stb.), minden rendben. Ha a felsorolásként egy (ebből vagy másik táblából származó) szöveges (varchar) mezőt (oszlopot) adok meg, amiben szabályosan vesszővel vannak elválasztva a felsorolás elemei, a MySQL nem fogadja el, egyszerű szövegnek látja, nem felsorolásnak. Kijátszható ugyan az IN helyett a LIKE használatával, de (főként, hogy egész számokról van szó), ez jelentősen lelassítja a keresést. Van erre más megoldás?
■
csak némi tipp
Esetleg nincs véletlenül mysqlben valami string2felsorolás() vagy string2tömb([elválasztójel]) függvény? ... és ha a "felsorolás"-t előbb egy változóba teszed? @v:=felsorolas ?
Sajnos, nem jött be
lehet, hogy tévedek,
Én a következőre tippelek (egy "képek behelyezése kategóriákba" problémán keresztül bemutatva):
"Photos" tábla: (photoid, name, categories)
"Categories" tábla: (catid, catname)
és ha jól sejtem, akkor a képek tábla categories mezőjében a catid-ek vannak felsorolva...
Ilyenkor használatos a kapcsolótábla ami után így nézne ki a dolog:
"Photos" tábla: (photoid, name [itt nincs categories mező!])
"Categories" tábla: (catid, catname)
"Cats_conn" tábla: (photoid, catid)
Ekkor ha egy kép több kategórába tartozik, a kategórianeveket megkapod az alábbi lekérdezés eredményeként
SELECT catname
FROM Photos AS p, Cats_conn AS conn, Categories AS c
WHERE p.photoid=conn.photoid AND conn.catid=c.catid
AND photoid=123
find_in_set ?
Sajnos mysql hibánál (és általában minden hibakeresésénél) fontos lenne tudni, hogy milyen környezetben jön a hiba. Jó lett volna, ha egy create table, insert megelőzte volna a selectet, akkor talán könnyebb lenne segíteni.
Hoztam létre egy környezetet, hogy ki tudjam próbálni, mi lehet a probléma.
Barna
A teljes felállás
Válasz: mert egy összetettebb lekérdezésről van szó, több allekérdezéssel, s ha egybe fogom az egészet, akkor tudok rendezni a MySQL-ban igény szerint, s már eleve így kapom meg az adatokat. Sajnos, a php rendezőképessége igen gyenge.
Tkp. elég lett volna egy olyan MySQL függvény is, ami egy vesszőkkel tagolt szövegből képes visszaadni a darabszámot - de ilyen nincs.
UI
A FIND_IN_SET-et megnéztem. Valószínűleg működne is, hiszen eleve szöveghez készült, de sajnos, nem darabszámot, hanem találati helyet ad vissza.
UI 2.
Ha más tanács nem lesz, akkor úgy tűnik, TeeCee ajánlata lesz a megoldás. Kár, hogy ez eggyel több táblát kíván.
mit is szeretnél?
szerintem belekeveredtél dolgokba.
amikor azt írtad, hogy nem php-vel akarod szétdobni, mert a mysql rendez csak jól, akkor nem gondoltál bele, hogy csak a vevőre rendezel (az idézett mysql kód szerint), amiatt a kódrészlet miatt nyugodtan lehet php-vel számoltatni (arról nem is beszélve, hogy a php igenis tud jól rendezni utf8-at)
aztánmeg sztem azt sem gondoltad végig, ha lesz mondjuk 1000 árud és 2000 vevőd, akkor a fenti sql vajon milyen sebességgel fut majd le?
próbálj ki más megközelítést és táblaszerkezetet (például TeeCee-ét)
Barna
Agyamra ment a hőség :))
WHERE find_in_set(aru.SORSZAM,vevo.KOSAR)>0
Másrészt végiggondoltam, sebességügyileg kellenek azok a kapcsoló táblák - jól gondolta TeeCee (azaz mindhárman), hogy miben hibáztam.
(A rendezésről: ez csak egy leegyszerűsített részlet, valójában vagy 10-15 oszlop alapján lehet rendezni és szűrni. S ha mindezt egy lekérdezésben oldom meg, akkor POST értékekkel megy MySQL-on belül.)
Sokat segített mindkét dolog, köszönöm mindenkinek! További kellemes hétvégét.
WHERE IN nem működik paraméterrel
Egyébként pont azt a hibát követed el, amit TeeCee ír a 3. hsz-ban.
Relációs adatbázisban a relációkat ne felsorolásként tárold, vagy ha mégis, akkor viseld a következményeit (extra feldolgozás, lassúság, nehéz kezelhetőség).
A rendes megoldás az lenne, hogy létrehozol egy kosár táblát (csak példa):
user_id
product_id
quantity
add_date
Ha kiváncsi vagy egy felhasználó termékeire:
select count(*) from cart where user_id = current_user_id
vagy
select sum(quantity) from cart where user_id = current_user_id
Azt gondolom most is figyeled, hogy ha ugyanazt a terméket adják hozzá mégegyszer, akkor vagy nem adja hozzá, vagy a mennyiséget hozzáadja a már bentlévő mennyiséghez.
A dátum azért kell, hogy néha lehessen takarítani, pl. az egy hónapja bent lévő termékeket. Előtte küldhetsz egy figyelmeztetést, így plusz esélyed van, hogy meg is rendelik a termékeket.
Egyáltalán nem kár, hogy plusz egy táblát igényel, az a kár, hogy bárkinek eszébe jut ezen spórolni (spórolni? inkább plusz munkát csinál).
Igen, belátom...
nem a táblák száma számít
Ezen kár spórolnod, inkább azt nézd, hogy mit nyersz általa. Egyrészt amit a többiek is mondtak, plusz lehetőséged lesz például külső kulcsok használatára, ami nagyon jól jöhet adatbázis integritásának megőrzéséhez, plusz általa egy csomó funkciót nem kell PHP-ban megoldanod.
Felhő