el nem végzett munka
Üdv!
Van két táblám és egy működő lekérdezésem ez az: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:meg így:
Ezek sajnos nem listázzák ki az el nem végzett feladatokat. Tudna valaki segíteni?
Köszi.
■ 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
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
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");
Köszi.
Pontosan mik vannak a
táblák tartalma
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
jó
rossz
jó
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.
A táblák szerkezete, az egyes
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?
f.db<>0
Csak az előírt feladatokkal foglalkozunk. A feladatok.db=0 azok nem előírt feladatok.
Tehát nem.
Na ezért kellene a struktúra,
működés
A count(m.mego)=0
A struktúra feljebb van az nem jó?
Struktúra
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
vagyUserId
, nem szimplánid
.táblaszerkezet
`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.
Hú...
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. ;)
.
Az ilyen válaszokkal
(Vagyis ne uppolj értelmetlenül.)
Írt valamit, aztán pár órával