Új hozzászólás Aktív témák
-
Jester01
veterán
válasz aton-hawk #201 üzenetére
Gondolom a REND_FEJ táblából lehet ezt lekérdezni:
SELECT pkód FROM REND_FEJ GROUP BY pkód HAVING MAX(kelt) < NOW() - INTERVAL 1 YEAR
(ez így mysql szintaxis)
Ha a pkód-on kívül egyéb adatok is kellenek akkor azt nyilván a PARTNER táblából lehet megkapni.
[Szerkesztve]Jester
-
Jester01
veterán
válasz concret_hp #204 üzenetére
Összakapcsolod a 2 táblát (join), csoportosítasz vevő szerint és szűrsz a darabszámra (HAVING COUNT(*) = 2)
Jester
-
Jester01
veterán
Izé, ha azokat kell kiírni amiket egy évnél nem régebben vagy soha nem vettek ki, akkor úgyis van where szûrés, szóval a decode-ban már nem kell vele foglalkozni. Ha a dateofcreation dátum típusú, akkor azt lehet, hogy még szöveggé is illene konvertálni.
Kb valami ilyesmire gondoltam:
SELECT ... DECODE(borrows.dateofcreation, NULL, 'SOHA', TO_CHAR(borrows.dateofcreation)) ... WHERE borrows.dateofcreation IS NULL OR borrows.dateofcreation > sysdate - 365Jester
-
Jester01
veterán
-
Jester01
veterán
-
Jester01
veterán
-
Jester01
veterán
-
Jester01
veterán
SELECT title, name FROM videos, members, borrows WHERE videos.videoid = borrows.videoid AND members.memberid = borrows.memberid AND members.dateofbirth = (SELECT min(members.dateofbirth) FROM borrows, members WHERE borrows.videoid=videos.videoid AND borrows.memberid = members.memberid)
Ezzel az lehet még a baj, hogy több azonos korú tag is kivehette a filmet, a fenti lekérdezés ilyenkor visszaadja mindet. Ha csak egy kell, akkor még egy group by-t lehet a végére akasztani.
Érdekességképpen egy hack megoldás, amibe nem kell al-select:
SELECT SUBSTR(MIN(TO_CHAR(members.dateofbirth, 'YYYY-MM-DD') || members.name), 11), videos.title
from borrows, videos, members
WHERE borrows.video=videos.videoid AND borrows.member=members.memberid
GROUP BY videos.title;Jester
-
Jester01
veterán
válasz Louloudaki #257 üzenetére
Az adatmennyiségtől erősen függ. Sok rekord esetén a join gyorsabb lesz.
Jester
-
Jester01
veterán
1. Az alias nem befolyásolja a where-t, ott attól még nyugodtan lehet használni az eredeti nevet is.
2. ez valami rettentő nagy eredményt ad: Ugyanis az al-selectben ha nem írod ki explicit a táblanevet/aliast akkor az a belső táblá(k)ra vonatkozik. Tehát tulajdonképpen azonosságot írtál (eltekintve attól, hogy NULL != NULL). Helyesen a külső selectben kell megadni tábla aliast és arra hivatkozni. Így ni:select bla, bla2, bla3, bla4,
(select count(*) from tabla where bla = kulso.bla) from tabla kulso where ...Jester
-
Jester01
veterán
Tulajdonképpen ha van string összefűzésre aggregáló függvény akkor meg lehet oldani egy GROUP BY kitétellel. Nem mondtad milyen adatbázis, mysql-ben van ilyen GROUP_CONCAT néven. MS SQL-ben és Oracle alatt is lehet rá workaroundot csinálni gugli szerint. Úgy látszik kicsit elhamarkodottan állítottam, hogy nem lehet.
Jester
-
Jester01
veterán
válasz vakondka #508 üzenetére
Szerintem elég lesz 1 join is.
SELECT pef.products_id
FROM products_to_products_extra_fields pef
LEFT JOIN products p ON p.products_id = pef.products_id
WHERE
(pef.products_extra_fields_id = 2 AND pef.products_extra_fields_value = 'piros') OR
(pef.products_extra_fields_id = 4 AND pef.products_extra_fields_value = '3')
GROUP BY pef.products_id
HAVING count(*) = 2Jester
-
Jester01
veterán
válasz vakondka #510 üzenetére
A join miatt termék-attribútum párokat kapsz, mégpedig annyit ahány egyezés volt az attribútum (tehát nem a termék!) szerint. Azt kell megnézni, hogy melyik termékhez van pontosan annyi sor ahány feltétel volt, ezért van a group by és a having. Ha lehagyod azt a részt akkor láthatod hogy néz ki a join eredménye. Ha több feltételed van, akkor azt a kettes számot ott át kell írni értelemszerűen.
Jester
-
Jester01
veterán
válasz Apollo17hu #539 üzenetére
SELECT A FROM t GROUP BY A HAVING COUNT(DISTINCT B) > 1
Ez persze az A értékeket adja meg, de innen gondolom már megy.
Jester
-
Jester01
veterán
válasz Apollo17hu #541 üzenetére
Hát mert nem mondtad milyen adatbázisod van ... mysql esetén működik, kipróbáltam.
Jester
-
Jester01
veterán
select t1.*,t2a.listing_field_value field1,t2b.listing_field_value field2 from t1,t2 t2a,t2 t2b where t2a.user_id = t1.user_id and t2a.listing_id = t1.listing_id and t2a.listing_field_name = 'field1' and t2b.user_id = t1.user_id and t2b.listing_id = t1.listing_id and t2b.listing_field_name = 'field2';
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz bbTamas77 #1853 üzenetére
A probléma az, hogy két időpont között ebben a formában lehet, hogy azonos eredményt kapsz amikor különböző időtartam volt valójában, hiszen az év illetve a hónapok hossza különbözhet.
Ha valami 1 hónapja volt, az függ attól az előző hónap milyen hosszú volt. Ha ez neked jó, akkor nincs gond.Jester
-
Jester01
veterán
válasz bbTamas77 #1863 üzenetére
Fentiek alapján nap-óra-perc-másodperc például imígyen megkapható:
SELECT CONCAT((UNIX_TIMESTAMP('2013-12-24 18:00') - UNIX_TIMESTAMP('2013-08-01 18:49')) DIV 86400, ' ',
SEC_TO_TIME((UNIX_TIMESTAMP('2013-12-24 18:00') - UNIX_TIMESTAMP('2013-08-01 18:49')) % 86400))Kicsit csúnya, hogy kétszer kell benne elvégezni a kivonást de a SEC_TO_TIME az csak korlátozott különbséget tud egyébként kezelni. A DATEDIFF pedig buta mert az idő részt figyelmen kívül hagyja.
[ Szerkesztve ]
Jester