ugrás a tartalomhoz

el nem végzett munka

misike · 2019. Jan. 6. (V), 10.04
Üdv!

Van két táblám és egy működő lekérdezésem ez az:
select f.feladat, f.db, count(m.mego) megoldottam from feladatok f left join matek m on f.feladat=m.felnev and m.id='$id' and m.mego='Jó' and DATE(m.ido)=CURDATE() where f.db<>0 group by f.feladat,f.db
A count(m.mego) megoldottam értéke az elvégzett feladatok száma. Ha nulla az az el nem végzett feladat.

Ez kilistázza egy embernek az elvégzett és el nem végzett feladatait. Abban kérnék segítséget hogy ez ne csak egy emberét listázza ki hanem csoportosan mindenkiét a felhasználónévvel együtt. Itt már van harmadik tábla.

Próbálkoztam így:
select u.user, f.feladat, f.db, count(m.mego) megoldottam from feladatok f left join matek m
on f.feladat=m.felnev and m.mego='Jó' and DATE(m.ido)=CURDATE() left join users u
on u.id2=m.id where f.db<>0  group by u.user, f.feladat,f.db
meg így:
select 
        u.user,
	f.feladat,
	f.db,
	count(m.mego) megoldottam 
	from   users u
	 join matek m on u.id2=m.id 
	right join feladatok f on f.feladat=m.felnev  
	  and m.mego='Jó' 
	  and DATE(m.ido)=CURDATE()-2 
	where f.db<>0 
	  and u.user <> 'Mindenki' 
	group by 
	  u.user,
	  u.feladat,
	  f.db");
Ezek sajnos nem listázzák ki az el nem végzett feladatokat. Tudna valaki segíteni?
Köszi.
 
1

Pontosan mik vannak a

MadBence · 2019. Jan. 6. (V), 21.14
Pontosan mik vannak a tablakban? Ha ismerjuk a tablak semajat, es hogy mit jelentenek az egyes oszlopok, ugy joval konnyebb lenne segiteni :)
2

táblák tartalma

misike · 2019. Jan. 6. (V), 21.49
A feladatok táblában ez van:

feladat
1
2
3
4
5

db
0
0
1
1
2
A feladatnak csak a száma van tárolva, az előírt a db mezőben van.


A matek táblában:

felnev
1
1
2

id
2
2
3

mego

rossz



ido
dátumok azt ne íron le

A feladatok.feladat=matek.felnev

users tábla tartalma
id2
2
3

user
aaaa
bbbb
Az users.id2 = matek.id

csak az ide vonatkozó mezőket soroltam fel. Gondolom a jelszó, pont, üres napok, teljesített napok stb nem fontosak.
3

A táblák szerkezete, az egyes

mind1 valami név · 2019. Jan. 6. (V), 22.06
A táblák szerkezete, az egyes mezők jelentése kellett volna szerintem. ;)

Az utolsó változatodban van egy where f.db<>0 - az nem gond, hogy így azok a sorok biztosan kimaradnak, ahol ez a db nullát tartalmaz?
4

f.db<>0

misike · 2019. Jan. 6. (V), 22.25
Ott van az az elsőben is.
Csak az előírt feladatokkal foglalkozunk. A feladatok.db=0 azok nem előírt feladatok.
Tehát nem.
5

Na ezért kellene a struktúra,

mind1 valami név · 2019. Jan. 6. (V), 22.56
Na ezért kellene a struktúra, némi magyarázattal, hogy melyik mező mit tartalmaz. Mert így csak merő találgatás az egész.
6

működés

misike · 2019. Jan. 7. (H), 08.38
Szóval: Vannak kijelölt feladatok a feladatok táblában. Amikor elkezd dolgozni a felhasználó akkor ezekből megold valamennyit. A megoldásai bekerülnek a matek táblába. Melyiket oldotta meg (felnev), ki oldotta meg (id), mikor oldotta meg (ido), jó vagy rossz (mego). De nem oldja meg mindet. Ezeket hagyja ki a lekérdezés.

A count(m.mego)=0

A struktúra feljebb van az nem jó?
7

Struktúra

Pepita · 2019. Jan. 7. (H), 10.52
CREATE TABLE `Test_Table` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`data`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT
;
Egy sql dump jó képet tud mutatni egy tábla struktúrájáról (fenti csak egy példa), utána ha egy felsorolásban leírnád, hogy melyik oszlop mire való, akkor jó eséllyel értenénk is. Természetesen elég csak a kérdésed szempontjából releváns oszlopokat leírni, viszont azokat pontosan.
Ha jól sejtem, itt foreign key - ek is vannak, ezeket is tartalmazza a dump.

SZERK.: célszerű egyébként a hivatkozott külső azonosítók oszlopneveit prefixelni, pl amelyik táblában hivatkozol a user tábla id mezőjére, ott az az oszlop user_id vagy UserId, nem szimplán id.
8

táblaszerkezet

misike · 2019. Jan. 7. (H), 19.41
CREATE TABLE `feladatok` (
`feladat` int(3) NOT NULL,
`db` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- A tábla adatainak kiíratása `feladatok`
--

INSERT INTO `feladatok` (`feladat`, `db`) VALUES
(1, 0),
(2, 0),
(3, 0),
(4, 1),
(5, 1),
(6, 0),
(7, 0),
(8, 1),
(9, 0),
(10, 0),



--
-- Tábla szerkezet ehhez a táblához `matek`
--

CREATE TABLE `matek` (
`felnev` int(3) NOT NULL,
`id` int(5) NOT NULL,
`ido` datetime NOT NULL,
`mego` varchar(5) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- A tábla adatainak kiíratása `matek`
--

INSERT INTO `matek` (`felnev`, `id`, `ido`, `mego`) VALUES
(1, 2, '2018-09-06 13:13:05', 'Jó'),
(1, 2, '2018-09-06 13:13:08', 'Jó'),
(1, 2, '2018-09-06 13:13:11', 'Rossz'),
(2, 2, '2018-09-06 13:13:14', 'Jó'),
(2, 2, '2018-09-06 13:13:19', 'Jó'),
(2, 2, '2018-09-06 13:13:24', 'Jó'),


-
-- Tábla szerkezet ehhez a táblához `users`
--

CREATE TABLE `users` (
`id2` int(5) NOT NULL,
`user` varchar(20) NOT NULL,
`pass` varchar(20) NOT NULL,
`nick` varchar(20) NOT NULL,
`pont` int(6) NOT NULL,
`napifel` int(5) NOT NULL,
`napos` int(4) NOT NULL,
`kep` varchar(30) NOT NULL,
`havipont` int(5) NOT NULL,
`dead` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- A tábla adatainak kiíratása `users`
--

INSERT INTO `users` (`id2`, `user`, `pass`, `nick`, `pont`, `napifel`, `napos`, `kep`, `havipont`, `dead`) VALUES
(1, 'aaaaa', 'xxxxx', 'xxxxx', 41, 0, 0, 'cica2.jpg', 0, 65),
(2, 'bbbbb', 'yyyyy', 'yyyyy', 3042, 0, 1, 'majom.jpg', 14, 28),

-
-- Indexek a kiírt táblákhoz
--

--
-- A tábla indexei `feladatok`
--
ALTER TABLE `feladatok`
ADD KEY `feladat` (`feladat`) USING BTREE;

--
-- A tábla indexei `matek`
--
ALTER TABLE `matek`
ADD KEY `id` (`id`,`ido`) USING BTREE,
ADD KEY `felnev` (`felnev`);

--
-- A tábla indexei `users`
--
ALTER TABLE `users`
ADD KEY `id2` (`id2`) USING BTREE,
ADD KEY `napos` (`napos`,`user`),
ADD KEY `pont` (`pont`,`user`) USING BTREE,
ADD KEY `havipont` (`havipont`) USING BTREE;



-- AUTO_INCREMENT a táblához `feladatok`
--
ALTER TABLE `feladatok`
MODIFY `feladat` int(3) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=79;

--
-- AUTO_INCREMENT a táblához `users`
--
ALTER TABLE `users`
MODIFY `id2` int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;
COMMIT;


Hátha ez is jó.

A működés:
Ki vannak jelölve a feladatok táblában néhány feladat. Ez a db mezőben van tárolva, ez az előírt feladat. A feladat az AUTO_INCREMENT.

A felhasználó kiválaszt egy listából valamennyit. Amit dolgozik az bekerül a matek táblába. Itt tárova van a feladat száma a felnev-ben, felhasználó id-ja, (user_id) ki munkája. Az dátum az ido mezőbem, és a mego-ban az eredmény jó vagy rossz. Ha nem old meg minden feladatot akkor lesz gond. Egy embernél kiírja az első lekérdezés az el nem végzett feladatokat. Csoportosban kérek segítséget.

Az users táblában a felhasználó id-ja id2 AUTO_INCREMENT, neve user, jelszava pass, beceneve nick, pontja pont, napi feladat teljesítése napifel, ... apróságok

Remélem érthető voltam.
9

Hú...

Pepita · 2019. Jan. 8. (K), 11.52
Kicsit ez így szét lett cincálva - gondolom PHPMyAdmin vagy hasonló a bűnös -, jobb lett volna egy tábla egy CREATE, ALTER nélkül.
Légyszíves kódhoz használj kódszínezőt.
Arra viszont jó, hogy feltegyem a kérdést: mennyire szeretnéd "profi módon", vagyis jól megcsinálni?
Feltételezem, hogy a lehető legjobban. :)
Ezek alapján pár észrevétel:
- feladatok.feladat amennyiben egyedi azonosító, akkor AUTO_INCREMENT és az oszlopnév id
- Egyedi azonosító lehetőség szerint minden táblában azonos (int(11)) típusú, és ha nem használsz az oszlopnevekben tábla prefixet, akkor mindegyik id néven fut. Azért, hogy mindenki értse. :)
- Ha használsz tábla prefixet, akkor azt minden táblán és minden oszlopon.
- Ha egy tábla egy mezője hivatkozik egy másik tábla egyedi azonosítójára, akkor azt be kell állítani FOREIGN KEY - nek, többnyire célszerű RESTRICT módban. (Másképp nem tudod mivel összekapcsolni a rekordot, mert pl butaság került bele.)
- A `pass` varchar(20) NOT NULL remélem csak vicc, nagyon súlyos biztonsági hiba, de mivel nem közvetlenül a kérdésedhez kapcsolódik, most nem részletezem.
- Oszlopnevekben (is) célszerű következetesnek maradni, vagy angol, vagy magyar, de nem keverék.

Ezekkel a szempontokkal szerintem alakítsd át a db-t, legyen szép és átlátható, kulcsokkal védett inkonzisztencia ellen.
`pass` varchar(64) NOT NULL legyen egyelőre, majd meglátjuk.
Ha kész az új db, írunk rá szép query-ket is. ;)
10

.

misike · 2019. Jan. 10. (Cs), 20.21
.
11

Az ilyen válaszokkal

Pepita · 2019. Jan. 11. (P), 10.36
nem fogsz több infóhoz / segítséghez jutni, ellenben kiválthat ellenszenvet is.
(Vagyis ne uppolj értelmetlenül.)
12

Írt valamit, aztán pár órával

mind1 valami név · 2019. Jan. 11. (P), 10.49
Írt valamit, aztán pár órával később átszerkesztette, gondolom, törölni akarta, csak nem tudta.