Jump to content
GSForum - Segélyvonal

SQL kérdésem van


google

Recommended Posts

google

Olyan kérdésem van, miként lehet phpMyAdminban összekötni táblákat egymással?

Teszem azt, van két táblám, és azt szeretném, ha az egyik azonosító mezõje hivatkozna egy másik táblára, ahol a többi adat van.

Link to comment
Share on other sites

Mezofi

SELECT biro.biro_neve,biro.orszag,partjelzo.partjelzo_neve,partjelzo.partjelzo_orszag FROM biro,partjelzo WHERE biro.merk_azon=1 AND partjelzo.merk_azon=biro.merk_azon

 

A partjelzo nevû táblából már csak azt a sort veszi ki, amelynek ugyanaz a merk_azon-ja mint a biro táblában talált sor, merk_azon mezõjében találttal.

:lol:

 

Ui: Az azonosító mezõ nem tud hivatkozni másik táblára! Azt neked kell megadnod melyik táblákat akarod összekötni, a lényeg, hogy legyen két táblában ugyanolyan oszlop, és ezekben az oszlopokban legyen egyenlõ értékû mezõ is.

Link to comment
Share on other sites

google

Értem! Akkor csak a lekérdezésben van különbség.

Link to comment
Share on other sites

  • 2 weeks later...
google

Egy olyan SQL-utasításra volna szükségem, amely megmondja, hogy a mezõben többször szerepel-e ugyanaz a karakterlánc. :hááát:

 

Ilyenem van:

LIKE '%$nev_vezetek_<span>$nev_kereszt%'

Ez a mezõben így néz ki:

Kovács <span>Kálmán</span> (21.)

Tehát megkapom, hogy ilyen név található-e a mezõben (a <span> természetesen csak a megjelenítés miatt kell).

 

Azonban nem egyszer elõfordul ilyen eset:

Kovács <span>Kálmán</span> (21., 44.)

Itt azt szeretném, ha tudnám a lekérdezés után, hogy kétszer szerepel benne a név.

 

Esetleg hajlandó lennék így megoldani a mezõben:

Kovács <span>Kálmán</span> (21.), Kovács <span>Kálmán</span> (44.)

 

A lényeg, hogy tudjam, pontosan hányszor szerepel benne.

Link to comment
Share on other sites

arpsoft

Ez az elv:

select mezö,count(*) as gyakorisag from tábla where mezö like minta group by 1

Ha pedig csak azokat szeretnéd megkapni, amikbõl több van, akkor:

select mezö from tábla where mezö like minta group by 1 having count(*)>1

Link to comment
Share on other sites

google
:hmm: A group by 1-nél az 1 mit fejez ki?
Link to comment
Share on other sites

arpsoft

Az eredmény tábla elsõ mezõje szerint.

Link to comment
Share on other sites

google

Sajnos az történik, hogy kiírja nekem az összes mezõ tartalmát, amelyben benne van a név. Négy ilyen van, a mysql_num_rows() és négy sort jelez. Egyben kétszer szerepel, egy másikban háromszor, a maradékban egyszer-egyszer.

Link to comment
Share on other sites

Mezofi

Bár tévedjek, de szerintem ilyen sql utasítás nem létezik, sõt amenyire én tudom php sztring függvénnyel sem tudod ezt meghatározni.

Szerintem elsõlépésként el kéne gondolkodnod, milyen adatokat akarsz tárolni. második lépésként pedig milyen adatokra van szükéséged. Végül pedig Olyan adatbázis struktúrát kialakítani ami mind neked, mind pedig az adatbáziskezelõnek megfelel. Ha gondolod, küld el nekem, hogy milyen adataid vannak, és azokból mit akarsz kigyûjteni. Megpróbálhatom harmadik normálformára hozni. Szerintem arpsoft is segítene.

De az nem jó ötlet, hogy még a css utasításokat is az adatbázisban tárolod! Azokat a felhasználás helyén is megadhatod.

:)

Link to comment
Share on other sites

google

Azt nehezen. Valahogy el kell különítenem a keresztneveket a vezetéknevektõl, külön mezõkben meg nem tárolhatom õket, mert teljesen változó, hogy melyik rekordban hány név van, van-e egyáltalán. Ezért nehéz a kérdés.

 

A normálforma-felajánlást köszönöm, de nem ott van a baj. Valahogy muszáj lesz megoldanom ezt a kérdést, mert ha sikerülne, akkor automatikusan generálódna rengeteg adat, amelyhez hozzá sem kellene nyúlnom azután. :)

Link to comment
Share on other sites

arpsoft

@mezofi:

http://www.1keydata.com/sql/sqllike.html

 

@google:

Az lehet a gond, hogy nem pont úgy vannak beütve a nevek mindenhová, ezért a group nem tud rendesen dolgozni.

Elõször az adataidat kellene egyformára szabni. Tehát ne forduljon elõ olyan, hogy van

  • Kovács <span>Ernõ</span>
  • Kovács<span> Ernõ</span>
  • Kovács <span>Ernõ </span>
mert ezek mindegyike más a group-nál, de a like megtalálja õket.
Link to comment
Share on other sites

google

Ilyen biztosan nincs. :nem:

Mivel a keresztneveket [így] írom be, spanné php-kóddal alakítom, tehát biztosan nincs elütés. :(

Link to comment
Share on other sites

arpsoft

FoxPro-ban meg lehet oldani, így:

select *,like("Kovács*Ernõ*",nev) as szuro,count(*) as elo from test group by szuro where like("Kovács*Ernõ*",nev) having count(*)>1 

Hogy mySQL-ben lehet-e hasonlót, azt nem tudom.

Link to comment
Share on other sites

google

Meg fogom próbálni (a saját szintaktikájával persze :D), hátha. Most már mindent megpróbálok. ;)

Link to comment
Share on other sites

Mezofi

@arpsoft

Azt mondod, hogy a LIKE parancs kiadásával megtudod számoltatni egy mezõn belül hányszor van ismételve a keresett szó?

 

Pl egy mezõ tartalma: " Tojást vennék, tojást keresek, tojás"

Kiadod a LIKE"tojás" utasítást és az megmondja, hogy háromszor van beírva az adott mezõben?

Szerintem csak megtalálja az adott mezõt, de, hogy hányszor ismétlödik benne a tojás szó, azt nem.

A LIKE utasítás nem erre van kitalálva!

Rövid pályafutásom alatt ilyenrõl nem hallottam, de azért lehet.

 

:D

Link to comment
Share on other sites

arpsoft

De nem ez volt a feladat!

A többször elõforduló neveket kellett megtalálni.

Én úgy értettem, hogy a név egyszer megvan a 21. rekordban és a 44. rekordban, de a mezõkben a név mellett még másik név is szerepelhet.

Tehát olyan rekord, hogy egy név kétszer szerepel egy mezõben nincs, mindig különbözõ nevek vannak.

Link to comment
Share on other sites

google

:upsz: Akkor bizony Mezofi értette meg jól!

Pontosan errõl van szó, hogy

...amely megmondja, hogy a mezõben többször szerepel-e ugyanaz a karakterlánc.
Link to comment
Share on other sites

arpsoft

Na ilyen sql utasítás nincs. Ebben az esetben át kéne alakítani a tábládat.

Kéne csinálni egy relációt a következõ módon:

a jelenlegi tábládban szerintem van egy mezõ, amivel a rekordokat egyértalmûen tudod azonosítani, tehát valamilyen id. Ha nincs, akkor csinálj egyet.

A neveket rakjad át egy másik táblába, aminek két mezõje van, az egyik az elõbb említett id a másik a név, amiben csak egy név fog szerepelni.

Ezek után bármikor elõállíthatod egy rövid kóddal az eredeti táblád tartalmát is az új tábla lekérdezésével, mivel az id mezõ összekapcsolja õket.

 

A számlálást pedig egy egyszerû sql utasítás elvégzi:

select id, nev, count(*) as elofordulas from nevek group by id

 

Ha csak azokat szeretnéd látni, amibõl több is van, akkor:

select id,nev,count(>) as elofordulas from nevek group by id having count(*)>1

Link to comment
Share on other sites

google

Köszönöm a tanácsot, de ez nem járható út sajnos, mivel teljesen eltérõ mennyiségû név szerepelhet 0-tól akár 10-ig is, borzasztóan felesleges volna megalkotni egy tízoszlopos táblát, csak azért, mert egyetlen rekordnak 10 mezõje van.

 

Azt hiszem, átgyúrom a dolgot úgy, hogy php-val próbálom megkeresni, az adott mezõben hányszor szerepel ugyanaz a string.

Link to comment
Share on other sites

arpsoft

De nem kell ilyen tábla!

Most valami lyened van:

1. blablablabla ejnyebejnye blablablabla almafaalmafa

2. blablablabla almafaalmafa ejnyebejnye

 

Az átalakítás során ilyen lenne az egyik tábla:

1.

2.

 

Ilyen a másik:

1. blablablabla

1. ejnyebejnye

1. blablablabla

1. almafaalmafa

2. blablablabla

2. almafaalmafa

2. ejnyebejnye

 

Mindkét táblának határozott szerkezete van.

 

Tessék a fejekbõl kiverni már a táblázatokat! Az adatbázis az nem Excel.

Link to comment
Share on other sites

Mezofi

Ha jól emlékszem én is a táblák újragondolását javasoltam.

:D

Az adatbázis egyik lényege, hogy amenyire lehet kerüljük a redundanciát ( bocsi, ismétléseket). Tehát azt eleve kerülni kell, hogy egy mezõben szerepeljen akár kétszer is ugyanaz az adat!

arpsoft is azt tanácsolja, hogy azonosítókkal kell hivatkozni a többször elõforduló adatokra.

:)

Ui: Mindent lehet csak akarni kell!

@google

Nem akarok pesszimista lenni, de azt is mondtam, hogy php sztring függvénnyel sem tudod megszámolni!

:Sír:

Link to comment
Share on other sites

arpsoft

Teljesen igazad van. Ha ez a feladat, akkor nincs másik megoldás. Szerintem.

Persze mindent le lehet kódolni, csak kérdés megéri-e. :hááát:

Link to comment
Share on other sites

google

Szerintem jobban megéri, mint a tábla, mert minden egyes névhez tartozik egy szám is, ami - mivel fociról van szó - 1-90-ig bárhol lehet, és elég valószínûtlen, hogy ismétlõdne a névvel együtt. Persze el lehet tárolni a számokat is külön táblában :pislog: , de az már eléggé az ágyúval verébre eset. :Sír: Ráadásul sokkal több új név van, mint amennyi összesen ismétlõdik. Azokat mind fel kell venni az adatbázisba, stb. ...

 

Az substr_count függvény miért nem jó?

Link to comment
Share on other sites

Mezofi

Beleszaladtam egy olyan lekérdezésbe amit még nem csináltam.

 

Van két tábla, egyben a termék nevek és a tkod mint kapcsoló mezõ.

A másikban a termék eladások darabszámai és a tkod.

Összekötöm, eddig megy, szeretném lekérdezni melyik termékbõl mennyit értékesítettem.

De az eladas táblában szétszórva vannak a tkod-ok és a mennyiségek.

ORDER BY-al szépen összerendeztem és egymás alatt látom a termékek eladásait, de egymás alatt mondjuk ötször fel van sorolva ugyanaz a termék, persze mert ötször adtam el belöle.

Azt kérdezném, hogyan tudom elérni, hogy termék kódonként összesítse az eladásokat.

Lehet, hogy belsõ SELECT-et kell használni?

Rémlik valami a COUNT-ról és a GROUP BY-ról, de nem tudom öszehangolni.

Most ez a kód, ami eladásonként sorolja fel.

$eladasok=mysql_query("SELECT eladas.tkod,termek.tnev, eladas.menny FROM eladas,termek WHERE eladas.tkod=termek.tkod ORDER BY termek.tnev");

:Sír:

 

Ui: Na, megvan!

$eladasok=mysql_query("SELECT termek.tnev,eladas.tkod,SUM(eladas.menny) FROM eladas,termek WHERE termek.tkod=eladas.tkod group by tkod order by tnev");

Link to comment
Share on other sites

arpsoft

Látod, megy ez! :D

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...