SQL - Returnarea datelor din 2 tabele

sql
mysql

(s.vitel) #1

Salutare,
Inca nu am scris pe forum, dar ma chinui de vreo doua ore sa formulez un query in care sa obtin ceva si numa’ nu reusesc. Bineinteles is incepator si pe partea de programare…

Deci sa trec la subiect. Am doua tabele muncitori(id, nume, prenume) si unde_a_lucrat(id, muncitor_id, data, loc)

Pe mine ma intereseaza sa afisez din tabelul muncitori doar pe cei care la o anumita data inca nu sunt inregistrati in tabelul unde_a_lucrat. Adica o sa setez cookie cu data si sa i-mi returneze doar acei muncitori care inca nu sunt inregistrati ca au lucrat in data respectiva.

Sper ca am fost cat de cat explicit.

$query = "“SELECT m.id, m.nume, m.prenume, u.muncitor_id, u.datum
FROM muncitor m
LEFT JOIN unde_a_lucrat u
ON m.id = u.muncitor_id
WHERE m.datum != $_COOKIE[‘date’]”;
Cam asa arata query care la mine nu functioneaza.


(Cosmin) #2

Ai putea sa faci ceva de genul:

"SELECT id, nume, prenume FROM muncitori WHERE id NOT IN (SELECT muncitor_id FROM unde_a_lucrat WHERE data = '".$_COOKIE['date']."')"


(Florin Frătică) #3

Query-ul ca să obții muncitorii care nu au lucrat într-o anumită dată:

SELECT id, nume, prenume
FROM muncitori
WHERE NOT EXISTS
    (SELECT *
     FROM unde_a_lucrat
     WHERE muncitor_id = muncitori.id
       AND data = ?);

Am folosit un subquery, noțiune cu care poți să te familiarizezi aici.

Dacă vrei să înveți SQL îți recomand tutorialul de pe w3schools. Ai și aici pe forum o discuție despre JOIN-uri, acestea fiind probabil cele mai complicate operații în SQL.

P.S.: Îți recomand să folosești prepared statements deoarece previn SQL injection, îmbunătățind securitatea aplicației.


(s.vitel) #4

Multumesc mult! a fost de ajutor. Ma tot chinuiam cu Join. Invat…


(s.vitel) #5

Multam’ pentru ajutor! Functioneaza si asa!


(Vlad) #6

_$query = "“SELECT m.id, m.nume, m.prenume, u.muncitor_id, u.datum FROM muncitor m LEFT JOIN unde_a_lucrat u ON m.id = u.muncitor_id WHERE m.datum != $COOKIE[‘date’] or m.datum is null”;


(Alexandru Tanase) #7

Este gresit query-ul (ar fi trebuit u.datam nu m.datam), si chiar daca ar fi fost corect tot nu ar fi intors ce trebuie.
Ar fi trebuit ceva de genul:
SELECT m.id, m.nume, m.prenume, u.muncitorid, u.datum FROM muncitor m left join (select id, data from unde_a_lucrat where datam != $COOKIE[‘date’]) u on m.id=u.muncitor_id where u.data is null
doar ca varianta asta este mult mai lenta decat cele prezentate mai sus, iar varianta propusa de florin.fratica este cea mai rapida


(Vlad) #8

Da, u.data, am copiat interogarea lui si am adaugat doar is null, nu m-am uitat.

Nu stiu care metoda este mai rapida, dar returneaza ce trebuie.

mysql> use devforum;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_devforum |
+--------------------+
| hj                 |
| muncitori          |
+--------------------+
2 rows in set (0.00 sec)

mysql> select * from hj;
+----+-------------+---------------------+
| id | employee_id | data                |
+----+-------------+---------------------+
|  1 |           1 | 2017-02-01 00:00:00 |
|  2 |           2 | 2016-02-01 00:58:20 |
|  3 |           3 | 2015-02-01 00:58:32 |
+----+-------------+---------------------+
3 rows in set (0.04 sec)

mysql> select * from muncitori;
+----+-----------+---------+
| id | nume      | prenume |
+----+-----------+---------+
|  1 | Popescu   | Marin   |
|  2 | Ionescu   | Vasile  |
|  3 | Cutarescu | lala    |
+----+-----------+---------+
3 rows in set (0.08 sec)

mysql> select m.nume, m.prenume from muncitori m left join hj on hj.employee_id
= m.id WHERE date(hj.data) <> curdate() OR hj.data is null;
+-----------+---------+
| nume      | prenume |
+-----------+---------+
| Ionescu   | Vasile  |
| Cutarescu | lala    |
+-----------+---------+
2 rows in set (0.00 sec)

LE: sau de ce zici ca nu returneaza ce trebuie?


(Alexandru Tanase) #9

Adauga pentru fiecare munctor si alte zile si atunci nu mai da ce trebuie. Teoretic va intoarce toti oamenii (chiar si dubluri) care nu au muncit deloc sau au muncit si in alte zile


(Vlad) #10

Yep, ai dreptate…
Cu is null returneaza tot, iar fara si cu conditie returneaza duplicat muncitorului pentru fiecare job.


(s.vitel) #11
$_arbeiters = $conn->select("SELECT id, name, vorname, status 
                                        FROM arbeiter 
                                        WHERE status = 1 
                                        AND id NOT IN 
                                            (SELECT arbeiter_id 
                                            FROM arbeitsaufteilung 
                                            WHERE datum = :datum)", 
                                array('datum' => $_SESSION['datum']));

asa am folosit si functioneaza perfect.

apropo. pe localhost am folosit cookie si a functionat dar cand am incarcat pe server nu a mai functionat.
am folosit ceva de genul:

if (isset($_POST['set_date'])) {
        setcookie('datum', $datum, time() - 3600);
    }

gresesc undeva?


(s.vitel) #12

cam asa arata tabelul/formularul in care am nevoie de query unde am cerut ajutor. ideea e ca fiecarui muncitor ii e alocat un rand care dupa ce dau submit se salveaza doar cei care au campurile completate.

chestiea e ca dupa ce completez de exeplu un rand si dau submit, il salveaza, acel rand nu mai apare, doar ca daca completez un alt rand si dau submit nu mai salveaza. trebuie mai intai sa dau refresh la pagina, si apoi functioneaza.

vreo idee sa rezolv chestia asta?

scuzati exprimarea mai …complicata