2017-04-03 5 views
1

Ich bin nur verwirrt. Habe schon versucht diese ganze Seite zu durchsuchen oder googlen aber nicht die 'nächste' Lösung gefunden.Mysql Abfrage zu zwei Bedingung in eine Zeile zusammenführen

Ok sagen wir habe ich diese Tabellenstruktur.

id date  finger_id finger_time is_enter 
1 2017-03-30 2   09:00  1 
2 2017-03-30 2   17:13  0 
3 2017-03-31 4   09:10  1 
4 2017-03-31 3   09:01  1 
5. 2017-03-31 3   17:00  0 

Ich möchte die Tabelle wie folgt machen.

date  finger_id enter_time exit_time 
2017-03-30 2  09:00  17:13 
2017-03-30 4  09:10 
2017-03-31 3  09:10  17:00 

Ich habe SQL-Anweisung gemacht, aber es dreht sich so.

date  finger_id enter_time exit_time 
2017-03-30 2   09:00 
2017-03-30 2      17:13 
2017-03-31 4   09:10 
2017-03-31 3   09:01 
2017-03-31 3      17:00 

Ich möchte nur wissen, wie die is_enter 1 mit is_enter 0 am selben Tag von der finger_id Spalte zu verschmelzen.

Hier ist meine SQL-Abfrage für die Referenz.

SELECT * 
FROM `tbl_fingerprint` 
    LEFT JOIN `tbl_employee` ON `tbl_employee`.`fingerprint_id`=`tbl_fingerprint`.`fingerprint_id` 
    LEFT JOIN `tbl_position` ON `tbl_position`.`position_id`=`tbl_employee`.`position_id` 
WHERE `fingerprint_date` >= '2017-03-01' 
AND `fingerprint_date` <= '2017-04-01' 
GROUP BY `tbl_fingerprint`.`fingerprint_id`, 
     `tbl_fingerprint`.`fingerprint_date`, 
     `tbl_fingerprint`.`is_enter` 
ORDER BY `fingerprint_date` ASC LIMIT 30 

Danke für Ihre Hilfe Jungs.

Antwort

1

Sie können ein group bydate und finger_id Felder tun und Bedingungsausdruck (case oder if()) innerhalb einer Aggregatfunktion das erwartete Ergebnis zu erhalten verwenden. Die bedingten Anweisungen innerhalb der Aggregatfunktion stellen sicher, dass sie nur dann einen Wert zurückgeben, wenn der richtige Wert im Feld is_enter festgelegt ist. Ich lasse die Mitarbeiterdaten aus, da diese nicht Teil Ihrer Frage bilden:

SELECT date, fingerprint_id, max(if(is_enter=1,finger_time,null) as enter_time, max(if(is_enter=0,finger_time,null) as exit_time 
FROM `tbl_fingerprint` 
WHERE `fingerprint_date` >= '2017-03-01' 
AND `fingerprint_date` <= '2017-04-01' 
GROUP BY `tbl_fingerprint`.`fingerprint_id`, 
     `tbl_fingerprint`.`fingerprint_date`, 
ORDER BY `fingerprint_date` ASC LIMIT 30 
+0

Mann, das ist großartig! Ich wurde gerade versucht Max zu verwenden, aber ich steckte fest, bis ich sah, dass deine großartig funktioniert! Ich danke dir sehr. Edit: Ich habe nur die Max auf Min geändert, da ich das niedrige Ergebnis bekommen werde, das ist großartig! – DennisFrea

+0

Akzeptiert, ich danke Ihnen für Ihre Hilfe, aber leider kann ich Ihre Antwort nicht aufwerten, da ich nicht den geringsten Ruf habe – DennisFrea

0
SELECT * FROM `tbl_fingerprint` 
LEFT JOIN `tbl_employee` ON `tbl_employee`.`fingerprint_id`=`tbl_fingerprint`.`fingerprint_id` 
LEFT JOIN `tbl_position` ON `tbl_position`.`position_id`=`tbl_employee`.`position_id` 
LEFT JOIN (SELECT * FROM tbl_fingerprint WHERE is_enter = 0) a 
    ON a.finger_id = tbl_fingerprint.finger_id AND a.date = tbl_fingerprint.date 
WHERE `fingerprint_date` >= '2017-03-01' AND `fingerprint_date` <= '2017-04-01' AND tbl_fingerprint.is_enter = 1 
GROUP BY `tbl_fingerprint`.`fingerprint_id`, `tbl_fingerprint`.`fingerprint_date`, `tbl_fingerprint`.`is_enter` 
ORDER BY `fingerprint_date` ASC LIMIT 30 
0

Try This (Das funktioniert, wenn finger_time von time Typ ist): -

SELECT date, finger_id, min(finger_time) enter_time, if (min(finger_time) = max(finger_time), null, max(finger_time)) exit_time FROM xyz group by finger_id, date 
0
SELECT a1.*, a3.time as time_out FROM attendance as a1 
INNER JOIN (SELECT MIN(id) as id FROM attendance where is_enter = '1' group by date, f_id) as a2 
ON a2.id = a1.id 
LEFT JOIN attendance as a3 ON a3.date = a1.date AND a1.f_id = a3.f_id and a3.is_enter = '0' 

Sie Möglicherweise muss das Datum umgewandelt werden, um den Zeitabschnitt nicht einzuschließen oder mit dem JJJJ-MM-TT-Format zu verkabeln

Verwandte Themen