2012-03-29 4 views
2

Beispiel TabelleninhaltMySQL, erhalten Daten aus zwei verknüpften Tabellen, wenn der zweite Tabelle nicht immer passende Zeilen haben

'main' 
| id | total | 
| 1 | 10 | 
| 2 | 20 | 
'timed' 
| id | id_main | date_from | date_to | total | 
| 1 | 2  | 2012-03-29 | 2012-04-29 | 50 |

Wunschergebnis

| id | total | 
| 1 | 10 | 
| 2 | 50 |

Nicht gerade Abfrage arbeiten

SELECT main.id AS id, COALESCE(timed.total, main.total) AS total 
FROM main 
LEFT JOIN timed 
ON main.id = timed.id_main 
WHERE SYSDATE() BETWEEN timed.date_from AND timed.date_to

Ergebnis

| id | total | 
| 2 | 50 |

In den Tabellen 'main' und 'timed' wird 'total' nie NULL sein. In einigen 'zeitgesteuerten' Datensätzen gibt es keine relative 'id_main', oder es gibt nur wenige, aber sie werden sich unterscheiden, 'date_from' 'date_to' schneidet sich niemals. Tabelle 'main' ist groß, aber 'zeitgesteuert' wird immer zwei oder drei relative Datensätze enthalten.

CREATE TABLE `main` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `total` decimal(10,2) unsigned NOT NULL DEFAULT '0.00', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 
INSERT INTO `main` VALUES (1,10); 
INSERT INTO `main` VALUES (2,20); 
CREATE TABLE `timed` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `id_main` int(11) unsigned NOT NULL DEFAULT '0', 
    `date_from` date DEFAULT NULL, 
    `date_to` date DEFAULT NULL, 
    `total` decimal(10,2) unsigned NOT NULL DEFAULT '0.00', 
    PRIMARY KEY (`id`), 
    KEY `link` (`id_main`) 
) ENGINE=InnoDB; 
INSERT INTO `timed` VALUES (1,2,'2012-03-29','2012-03-30',50); 
ALTER TABLE `timed` 
ADD CONSTRAINT `link` FOREIGN KEY (`id_main`) 
REFERENCES `main` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Entschuldigung für mein Englisch.

Antwort

1

Sie sollten das Datum Zustand im Joinbedingung bewegen:

SELECT main.id AS id, COALESCE(timed.total, main.total) AS total 
FROM main 
LEFT JOIN timed 
ON main.id = timed.id_main and SYSDATE() BETWEEN timed.date_from AND timed.date_to 

In Ihrer Abfrage, die Zeilen nicht abgestimmt werden durch die WHERE-Bedingung herausgefiltert, weil timed.date_form und timed.date_to null sind, so sysdate kann nicht zwischen ihnen sein :)

+0

Oh, verdammt. Ich denke, ich brauche eine Brille. Vielen Dank. –

Verwandte Themen