MySQL lekérdezés

Adott egy MySQL adatbázis ásványok adataival. természetesen egy fajta (nevű) ásványból van több is, esetenként csak az ID változó.
Az a kérdésem, hogy lehet-e olyan lekérdezést csinálni, ami úgy írja ki az asvanyok tábla nev oszlopát, hogy minden nevet csak egyszer jelenít meg.

Ezalatt azt értem, hogy ha mondjuk van az adatbázisban 2 ametiszt és 1 citrin, akkor a kimenet:

Ametiszt
Citrin

A válaszokat előre is köszönöm.

Drvanger

Hozzászólások

a "distinct" kulcszónak nézz utána
pl.: select distinct nev from asvanyok

Select nev from asvanyok group by nev

Vagy
Select DISTINCT nev from asvanyok

hali

egy mysql adatbázisból szeretném a 2007-01-01 és 2007-02-04 közötti sorokat kilistázni
hogyan?

S ELECT * FROM tablaneve WHERE valami_kelte >= 2007-01-01 AND valami_kelte <= 2007-02-04

szerk:megoldva. :)

Nem kötözködés, de érdemes az adatbáziskezelés tárgykörében ismert anomáliákat elkerülni. Pl. ha ilyen a táblád:
1 ametiszt 5deka
2 ametiszt 10darab
3 Citrin 6liter
Ez esetben az ametiszt mint név redundánsan szerepel, ami mindenféle gubanchoz vezethet. Tegyük fel, hogy egyszercsak úgy döntesz, hogy minden ametisztet nagy kezdőbetűvel írsz, és a 2-es id-jűt elfelejted update-lni. Ezután kiadsz egy lekérdezést, ami az "Ametiszt" nevű ásványok id-it választja ki. Visszakapod az 1-est, és a 2-est nem.
Ezért érdemes ilyen esetben két táblával megoldani a dolgot:
asvany(asvany_id, nev)
raktar(raktar_id, asvany_id, mennyiseg)
NE gondold, hogy időt takarítasz meg magadnak azzal, ha nem alakítod át a sémádat úgy, hogy ne legyen benne felesleges redundancia, addig, amíg megteheted.

szerencsere a mysql alapbeallitasok mellet nem erzekeny a kis/nagybetukre, ettol fuggetlenul igazad van a normalizalassal kapcsolatban. bar en akkor mar csinalnek egy harmadik tablat is -mennyisegi egysegeknek-, es a mennyiseget es a mennyisegi egyseget kulon mezoben tarolnam, nyilvan a mennyisegi egyseget kapcsolva az uj tablaval.

Azután szeretnék érdeklödni hogyan tudnám csak a utolsó bejezést lekérni a adatbázisbol?

$result = mysql_query("SELECT userid FROM users");
while($row = mysql_fetch_array($result))
{
echo $row['userid'];
}

Ha a userid auto_increment akkor:

SELECT userid FROM users WHERE userid =(SELECT MAX (userid) FROM users) )

ha nem akkor:

IDENT_CURRENT('table_name')

Szerk: IDENT_CURRENT() szakavatott mysql kolléga szerint nincs a MySQL-ben! Be kell rakni egy időbélyeget - ha van rá lehetőség - és azt szűrni a MAX() függvénnyel.

Konkrét táblán tesztelve cache nélkül:
1000000 kör időigénye:
ORDER BY, LIMIT: 0.0241
= MAX(..) : 0.0257

Effektíve kb. ugyanolyan gyorsak. A subquery-t szépen kioptimizálja a mysql a második megoldásból, viszont szerintem sokkal csúnyább mint a rendezéses verzió.

Kedves HUP-os MySql-es honfitársaim!
Szeretnék egy kérdést feltenni, új topik-ot nem akartam nyitni, hiszen a lekérdezés a témám nekem is.
Adott egy táblázat sok-sok rekorddal. A táblázatnak van egy "Hivatkozás" oszlopa, ahol url találhato.
Ez az url idő közben megváltozott. Hogyan lehetne csoportosan kicserélni minden sorban azt, hogy:
C:\alma\01.jpg -ből D:\korte\01.jpg legyen? Tehát csak a "C:\alma" legyen "D:\korte" ?
Van pár táblám, amivel ez a helyzet, és hát... egyessével ezer év lenne.
Köszönöm szépen előre is!
---
Üdv: Tibi

Nem ertek hozza igazabol, ezert en ugy csinalnam, hogy ha fix, amit cserelni kell, akkor vegignyomnek egy substring -et, amivel levagom az elejet, utana meg egy concat-tal hozzafuznem az ujat minden rekord adott mezojenek tartalmahoz.
:-) legalabb is ebben az iranyban indulnek el egy dump-olt mintan.

könyvjelző :) ez jól jött most nagyon.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Hello,

Nem ér egy új topicot, de már bele örülök, hogy nem tudom megírni ezt a lekerdezést.

+----+------------------+------------+-------------+-----------+--------+---------------------+
| id | name | year | month | day | price | checkdate |
+----+------------------+------------+-------------+-----------+--------+---------------------+
| 1 | name1 | 2011 | 4 | 1 | 94.35 | 2011-03-30 08:57:10 |
| 2 | name2 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:57:47 |
| 3 | name1 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:58:00 |
| 4 | name1 | 2011 | 4 | 1 | 94.35 | 2011-03-30 08:58:57 |
| 5 | name2 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:59:29 |
| 6 | name1 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:59:41 |
| 7 | name2 | 2011 | 4 | 8 | 55.99 | 2011-03-30 09:00:04 |
| 8 | name1 | 2011 | 4 | 8 | 45.99 | 2011-03-30 09:00:15 |
| 9 | name1 | 2011 | 4 | 12 | 56.39 | 2011-03-30 09:00:51 |

Kb így néznke ki a táblában az adatok, csak sokkal több van. Azonos névvel több is szerepelhet , minden lehet azonos kivéve az id és a timestamp, mint látszik a 2-es 5-ös ID-val rendelkező adat ugyan az, kivéve a timestamp.
Egy olyan lekérdezés kellene amiben mindig a lújabb timestapel rendelkező infokat adja vissza.
Tehát a lekérdezés után kb ezt kellene látnom:

+----+------------------+------------+-------------+-----------+--------+---------------------+
| id | name | year | month | day | price | checkdate |
+----+------------------+------------+-------------+-----------+--------+---------------------+
| 4 | name1 | 2011 | 4 | 1 | 94.35 | 2011-03-30 08:58:57 |
| 5 | name2 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:59:29 |
| 6 | name1 | 2011 | 4 | 5 | 43.49 | 2011-03-30 08:59:41 |
| 7 | name2 | 2011 | 4 | 8 | 55.99 | 2011-03-30 09:00:04 |
| 8 | name1 | 2011 | 4 | 8 | 45.99 | 2011-03-30 09:00:15 |
| 9 | name1 | 2011 | 4 | 12 | 56.39 | 2011-03-30 09:00:51 |

Group by-al sikerűlt szűrnöm a name,year,month,day -re,de nem a legfrissebb timestamp-el rendelkező adatot adta vissza.
Rermélem azért érthető a problémám.
Köszi.

Szia,

Gondolom, hogy az ID autoincrement PK, akkor

select name, year, month, day, price, max(checkdate), max(id)
from table
group by name, year, month, day, price

ha az ID nem autoincrement PK, akkor nem túl optimáltan lehet pl. ez:

select a.*, b.id
from(
select name, year, month, day, price, max(checkdate) as checkdate
from table
group by name, year, month, day, price
) as a
left join(
select *
from table
group by name, year, month, day, price
) as b
on b.name=a.name and ... and a.checkdate=b.checkdate

itt az on-os részben az a és b subselect year, month, day, price mezőit is össze kell join-olni, csak lusta voltam végigírni

Az id autoincrement az első lekérdezés lefut de rossz eredményt ad, mert a price és az id nem lesz szinkronban más pricet ír mint ami valójában tartozik az id-hoz.

A második lekérdezés elég jó, csak az id-hoz sokszor egy nagy NULL-t ír ki amit nem értek még miért, de kb azt az eredményt adja amit elvártam.