- Az Apple iPadOS-t is megrendszabályozza az EU
- Milyen routert?
- Súlyos adatvédelmi botrányba kerülhet a ChatGPT az EU-ban
- Mindenki AI-t akar, már 2025-re is eladták a HBM chipeket
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Az USA nem akarja visszafogni Kína növekedését
- Ubiquiti hálózati eszközök
- Mikrotik routerek
- Milyen NAS-t vegyek?
- Aliexpress tapasztalatok
Új hozzászólás Aktív témák
-
rt06
veterán
válasz laracroft #717 üzenetére
nem left, hanem inner join kell neked
a left join ugyanis lekeri azon ugyfeleket is, akikhez nincs naplobejegyzes, s igy mindenkit kiutsz
tovabba a belso select-be folosleges annyi mezo, a cast, es az orderPolitikailag korrekt, valamint munkahely- és gyermekbarát aláírás, amiben egyáltalán nincsen p*na.
-
martonx
veterán
válasz laracroft #717 üzenetére
Maga a lekérdezés is túlbonyolított.
1. Te egy darab táblát kérdezel le. Minek ehhez alselect? Illetve az alselect egész jónak tűnik, minek ehhez főselect???
2. Felesleges alakítgatni az account-ot, Line-t, ha karakteres, ha nem.Tehát az elgondolásod rossz volt, de az alselected nem reménytelen.
Én kérek elnézést!
-
Sk8erPeter
nagyúr
válasz laracroft #717 üzenetére
Az előző válaszokon túl annyit tennék hozzá, hogy
1. Nehezen áttekinthetővé teszi a kódodat (de még saját magad számára is), hogy csupa nagybetűvel írsz mindent. Legalább a mezőneveket ne (a SELECT, INSERT, UPDATE, AS, WHERE, ORDER BY, stb. kulcsszavakat megszokásból én is a mai napig nagybetűkkel írom - amúgy számomra talán épp a megszokás miatt így áttekinthetőbb is, mert tudom, mi a mezőnév, és mi nem - épp ezért érdemes legalább az egyiket kisbetűkkel írni).
2. MINDEN programnyelv esetén kerüld az ékezetek használatát.[ Szerkesztve ]
Sk8erPeter
-
Apollo17hu
őstag
válasz laracroft #992 üzenetére
Nem tudom leellenőrizni a szintaktikáját, de én így csinálnám (aposztróf kell, nem?):
SELECT t.leiras
,COUNT(*) || ' db'
FROM naplo AS t
WHERE
t.ido BETWEEN '2012-11-01' AND '2012-11-25'
AND t.leiras LIKE '%0-_s%'
GROUP BY t.leirasvagy így, ha 100 felett még menne akár millióig, de azokra nincs szükséged:
SELECT t.leiras
,COUNT(*) || ' db'
FROM naplo AS t
WHERE
t.ido BETWEEN '2012-11-01' AND '2012-11-25'
AND (t.leiras LIKE '%10-es%'
OR t.leiras LIKE '%20-as%'
OR t.leiras LIKE '%30-as%'
OR t.leiras LIKE '%40-es%'
OR t.leiras LIKE '%50-es%'
OR t.leiras LIKE '%60-as%'
OR t.leiras LIKE '%70-es%'
OR t.leiras LIKE '%80-as%'
OR t.leiras LIKE '%90-es%'
OR t.leiras LIKE '%100-as%')
GROUP BY t.leiras -
Sk8erPeter
nagyúr
válasz laracroft #998 üzenetére
Szerintem ezzel van a para:
....
(select ......, LEIRAS
from NAPLO
where a.LEIRAS like '%Helyszínen%') as a
union
(select ...., LEIRAS
from NAPLO
where b.LEIRAS like '%Leellenõrizve%') as b
....az a.LEIRAS és b.LEIRAS mezőkre gondolok, így nem hivatkozhatsz rájuk, mert az alquery-ben nem ismeri a MySQL, hogy mi az az "a" meg mi az a "b".
Az alquery-n, a zárójeles részben belül szerintem nem is kell az alias, vagy ha mégis, akkor jó helyre írd az aliast, például:(select ......, LEIRAS
from NAPLO n1
where n1.LEIRAS like '%Helyszínen%') as aRemélem nagyjából érthető, mire gondolok.
Ja, bocs, most néztem tovább, tényleg, tuti, hogy az IF is szar.
De mondjuk sokat segített volna, ha bemásolod a konkrét hibaüzenetet, hogy mire hivatkozik.
Szerintem CASE-t kéne használnod:
http://dev.mysql.com/doc/refman/5.0/en/case.htmlNa, ha nem sikerül, megnézem normálisabban is, most ennyire tellett.
[ Szerkesztve ]
Sk8erPeter
-
Apollo17hu
őstag
válasz laracroft #998 üzenetére
Töröm a fejem rajta, de kicsit homályos, amit írtál. Pontosan milyen eredményt szeretnél? (Olyan példa jó lenne, amilyet az előző kérdésedben írtál.) A "line" mező biztosan az ügyfelet azonosítja? Arra elég az "account", nem? A "line" gondolom, valamilyen rekordazonosító/bejegyzésazonosító, tehát erre nincs szükséged a lekérdezés eredményében. (Vagy igen?)
Egy ügyfélhez bármennyiszer tartozhat a 'Helyszínen' és 'Lellenőrizve' kifejezéseket tartalmazó bejegyzés vagy csak 1-1 (= 2) db? Tehát ügyfelenként csak 0, 1 és 2 érték várható?
-
Apollo17hu
őstag
válasz laracroft #998 üzenetére
Írtam egyet, talán használni tudod, bár én nem MySQL-t, hanem SQL-t használok:
SELECT sub2.account
,sub2.line
,CASE WHEN sub2.ido_helyszinen IS NOT NULL
AND sub2.ido_leellenorizve IS NOT NULL
AND sub2.diff_fl IS NOT NULL
THEN 2 -- ha helyszínen és leellenőrizve is van 15+ perc különbséggel
WHEN sub2.ido_helyszinen IS NULL
AND sub2.ido_leellenorizve IS NULL
THEN 0 -- ha helyszínen és leellenőrizve sincs
ELSE 1 -- minden más esetben
END db
FROM (SELECT sub1.account
,sub1.line
,sub1.ido_helyszinen
,sub1.ido_leellenorizve
,CASE WHEN (sub1.ido_helyszinen - sub1.ido_leellenorizve)*1440 > 15
THEN 'x'
END diff_fl
FROM (SELECT t.account
,t.line
,MIN(CASE WHEN t.leiras LIKE '%Helyszínen%'
THEN t.ido
END) ido_helyszinen
,MIN(CASE WHEN t.leiras LIKE '%Leellenõrizve%'
THEN t.ido
END) ido_leellenorizve
FROM naplo t
WHERE 1=1
AND (t.leiras LIKE '%Helyszínen%' OR t.leiras LIKE '%Leellenõrizve%')
GROUP BY t.account
,t.line) sub1) sub2[ Szerkesztve ]
-
martonx
veterán
válasz laracroft #998 üzenetére
Ötlet látatlanban:
1. csinálsz egy alselectet:
select account, line, leiras, min(ido) as minido, max(ido) as maxido
from naplo
where LEIRAS like '%Helyszínen%' or LEIRAS like '%Leellenõrizve%'
group by account, line2. majd ezt az alselectet felhasználva
select account, line case when timestampdiff(minute, maxido, minido) > 15 then 2 else 1 end as eredmeny
from fenti_alselectÉn kérek elnézést!
-
Apollo17hu
őstag
válasz laracroft #1034 üzenetére
SELECT DISTINCT
ugyfel.account AS account,
ugyfel.line AS line,
ugyfel.name1 AS name,
ugyfel.address3 AS irszam,
ugyfel.address1 AS varos,
ugyfel.address2 AS utca,
COUNT(*) over(PARTITION BY ugyfel.account, ugyfel.line) AS darab
FROM ugyfel, naplo
WHERE naplo.account = ugyfel.account AND naplo.line = ugyfel.line AND ugyfel.name1 NOT LIKE "%teszt%"
ORDER BY darab DESCCOUNT(*) over(PARTITION BY ugyfel.account, ugyfel.line) jelentése:
Csoportosítod a rekordokat: az ugyfel.account + ugyfel.line kombó minden csoportot egyértelműen azonosít. A COUNT(*) ezekre a csoportokra vonatkozik. DISTINCT pedig azért kell, mert enélkül a csoportok minden egyes rekordja új sort generálna (azonos tartalommal).
megj.: Erre szerintem az ORDER BY darab DESC nem működik (bár én csak sima SQL-t használok). Allekérdezéssel ez is áthidalható.
[ Szerkesztve ]
-
Apollo17hu
őstag
-
martonx
veterán
válasz laracroft #1034 üzenetére
Az alap SQL kérdéseket már el se szoktam olvasni, de látom egy ideje nem kapsz választ. Tessék:
SELECT ugyfel.account AS account,
ugyfel.line AS line,
COUNT(1) AS darab
FROM ugyfel, naplo
WHERE naplo.account = ugyfel.account AND naplo.line = ugyfel.line AND ugyfel.name1 NOT LIKE "%teszt%"
GROUP BY account,line
ORDER BY darab DESCÉn kérek elnézést!
-
válasz laracroft #1060 üzenetére
http://dev.mysql.com/doc/refman/5.6/en/counting-rows.html - a dokumentációs oldalak publikusak.
-
válasz laracroft #1062 üzenetére
A COUNT() mindig a paraméterként megadott expression-t vizsgálva NULL-ra. Ha nem NULL, akkor beleveszi az adott elemet a végső összegzésbe. A COUNT(1), COUNT(*) sosem NULL (Oracle alatt a COUNT(1)-ből COUNT(*) lesz elvileg), így azonos a kettő. Ha field nevet adsz át, akkor abban az esetben, ha az adott rekordot adott field-je alatt NULL value van, akkor azt nem fogja összeszámolni.
-
fordfairlane
veterán
válasz laracroft #1223 üzenetére
Ha a két lekérdezés túl sokáig tart, akkor egy is. Át kéne nézni / gondolni a táblák-mezők indexelését, amivel gyorsítani lehet az ilyesfajta lekérdezéseken.
A másik lehetőség, hogy, jellemzően webes környezetben sokkal több a táblából olvasás, mint az írás. Ebben az esetben azokat az aggregált adatokat, amelyek csak írás esetén változhatnak meg, és a lekérdezésük időigényes, előre ki lehet számolni, majd valahogy letárolni. Kvázi gyorsítótárazni. Mondjuk ez jelen esetben nem igazán járható út, de talán részhalmazokat elő lehetne állítani, amiket aztán gyorsabb átfésülni.
[ Szerkesztve ]
x gon' give it to ya
-
Apollo17hu
őstag
válasz laracroft #1217 üzenetére
MySQL-t nem tudom, de "sima" SQL-ben így lehetne (rendezést kiszedtem):
SELECT *
FROM (SELECT ugyfel.account AS account,
ugyfel.line AS line,
naplo.ido AS ido,
naplo.leiras AS leiras,
SUM(CASE WHEN naplo.leiras LIKE '%valami%' THEN 1 END) AS darab1
SUM(CASE WHEN naplo.leiras LIKE '%valami%' AND naplo.ido LIKE '2013-05%' THEN 1 END) AS darab2
FROM ugyfel,
naplo
WHERE naplo.account = ugyfel.account
AND naplo.line = ugyfel.line
GROUP BY ugyfel.account,
ugyfel.line,
naplo.ido
naplo.leiras
)
WHERE darab1 IS NOT NULL OR darab2 IS NOT NULL -- azon sorok kiszűrése, amelyek egyik feltételnek sem tesznek eleget -
-
martonx
veterán
válasz laracroft #1655 üzenetére
Nem kötözködésképpen, de nudli 800.000 sorhoz egy ennyire alap group by-hoz megkockáztatom, hogy nem kellene 1 másodperc sem. Az elég árulkodó, hogy ez a te gépeden 10 másodperc volt (hacsak nem valami P4-esen futtatod a db-t). Ha a két db séma ugyanaz, akkor szinte biztos, hogy nincs jól indexelve az adatbázis.
Én a helyetekben utána néznék.Én kérek elnézést!
-
Apollo17hu
őstag
válasz laracroft #1776 üzenetére
Nem tudom, hogy mysql-ben van-e CASE WHEN, de ha igen, akkor:
WHERE
...
CASE WHEN COMP.ZONE1 LIKE "%PROC%" THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE2 LIKE "%PROC%" THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE3 LIKE "%PROC%" THEN 1 ELSE 0 END +
...
CASE WHEN COMP.ZONE16 LIKE "%PROC%" THEN 1 ELSE 0 END < 5...tehát képzel egy 16 tagú összeget, és megnézed, hogy kisebb-e 5-nél.
-
-
martonx
veterán
válasz laracroft #1781 üzenetére
Tudom csak kívülről beleokoskodás valós megoldás helyett, de milyen hülyeség már, hogy Zone1-16 mezők vannak a táblában, miközben sokkal normálisabb megoldás lenne, ha egy a többhöz kapcsolatban a Zone-ok ki lennének szervezve egy külön táblába. És máris elég lenne egy group by rájuk az ilyen lekérdezésekhez
Ha pedig valahol mégis egymás mellett kellene megjeleníteni őket, akkor mehetne egy view a táblára benne egy pivot-tal. Sokkal normálisabb adatbázis szerkezet lenne.
Én kérek elnézést!
-
Apollo17hu
őstag
válasz laracroft #1781 üzenetére
Azon rekordokat keresem, akinek a COMP táblájának ZONE1-ZONE16 mezőjeiben szerepel a PROC szó ÉS a 16 zónából 5-nél kevesebb mezőben van egyáltalán valamilyen érték (Nem csak PROC szó szerepelhet a mezőkben)
...
WHERE COMP.ZONE1 || "." ||
COMP.ZONE2 || "." ||
COMP.ZONE3 || "." ||
COMP.ZONE4 || "." ||
COMP.ZONE5 || "." ||
COMP.ZONE6 || "." ||
COMP.ZONE7 || "." ||
COMP.ZONE8 || "." ||
COMP.ZONE9 || "." ||
COMP.ZONE10 || "." ||
COMP.ZONE11 || "." ||
COMP.ZONE12 || "." ||
COMP.ZONE13 || "." ||
COMP.ZONE14 || "." ||
COMP.ZONE15 || "." ||
COMP.ZONE16 LIKE "%PROC%" AND
CASE WHEN COMP.ZONE1 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE2 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE3 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE4 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE5 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE6 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE7 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE8 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE9 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE10 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE11 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE12 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE13 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE14 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE15 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN COMP.ZONE16 IS NOT NULL THEN 1 ELSE 0 END < 5[ Szerkesztve ]
-
Apollo17hu
őstag
válasz laracroft #2001 üzenetére
Nem ismerem a MySQL szintaktikát, de úgy lehetne, hogy rászűrsz name = 'Hát Izsák' -ra, a kapott rekordok mellé pedig számlálót képzel analitikus függvénnyel [rank(), rownum() stb.] a datetime mező csökkenő sorrendje szerint. Ha ez kész, akkor a számláló 1-es és 2-es értékét tartod meg, ezt a két dátumot kell kivonnod egymásból (előbbiből az utóbbit).
-
Apollo17hu
őstag
-
martonx
veterán
válasz laracroft #2079 üzenetére
Közben rájöttem, hogy a Dbfiddle sokkal jobb, mint az sqlfiddle, ami konkrétan nem működik.
MySql 8-al csináltam meg, ami már lassan felnő a normális adatbáziskezelők szintjére (ismeri a window függvényeket, és a common table expression-öket).Szóval itt a megoldásom, remélem jól értettem, és ezt szeretted volna: [link]
Én kérek elnézést!
-
nevemfel
senior tag
válasz laracroft #2187 üzenetére
Ha Mysql 8.0.1=< vagy MariaDB 1.2.40=<, akkor CTE-vel viszonylag egyszerű:
WITH RECURSIVE cte AS (SELECT 1 AS value UNION ALL SELECT value + 1 FROM cte WHERE value < 100)
SELECT value FROM cte LEFT JOIN naplo ON cte.value = naplo.id WHERE id IS NULLCTE nélkül, pl. 5.7-es mysql alatt nem tudom, talán tárolt eljárással.
[ Szerkesztve ]
Forget your troubles, c'mon get happy
-
félisten
válasz laracroft #2216 üzenetére
Rég nem mysql-eztem, de talán így (ha a create/drop view-hoz van engedélyed)
create or replace view myview as
select *
from t1
group by line, account
having count(email)=0;
select t1.*
from t1, myview
where t1.line = myview.line and t1.account = myview.account
order by line, account;
drop view myview;Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
félisten
válasz laracroft #2218 üzenetére
Utolsó sor biztos ERROR...
UI: akko' 2.-5.-ig kell csak és a
select *
helyettselect line, account
UUI: Nem igazán értem, hogy az általad linkelt "tábla" (ami mezei Excel, Google, LO stb stb) mire volt jó... Kurvára nem az eredeti DB records...[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)