MySQL: Alle IDs, die an bestimmten Date keine Daten haben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

MySQL: Alle IDs, die an bestimmten Date keine Daten haben

Beitrag von Liffi » 01.02.2013 08:14:42

Ich bin auf der Suche nach einem Befehl und bekomme es im Moment nicht auf die Reihe, vermutlich fehlt mir einfach die richtige Idee/der richtige Befehl.

Ich habe eine Tabelle die vereinfacht folgende Struktur hat:

Code: Alles auswählen

+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| ID               | int(10) unsigned | NO   | PRI | NULL    |       |
| date             | date             | NO   | PRI | NULL    |       |
| value            | int(10)          | NO   |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+
Nun möchte ich alle IDs haben, die zu einem bestimmten date keinen Wert haben.
Umgangssprachlich ausgedrückt:
'Gib mir alle IDs, die am 10.01.2013 keinen Wert haben.'

Im Moment spiele ich mit DISTINCT und ANY rum, um zumindest schon mal eine Liste der IDs zu bekommen und sie abzufragen, scheitere aber am: Frage ab, wo nichts ist.

Vielleicht hat ja jemand eine Idee, wie man das Problem einfach lösen kann.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von syssi » 01.02.2013 09:27:55

Nur ein Beispiel:

Code: Alles auswählen

select ID from table where value IS NULL and date < CURDATE()
Bei der Bedingung fuer "date" solltest du aufpassen, dass sie sich ebenfalls im Date-Format befindet. Hier findest du eine Vielzahl von Hilfsfunktionen zu Auswahl:

http://dev.mysql.com/doc/refman/5.5/en/ ... tions.html

Gruss syssi

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von Liffi » 01.02.2013 09:47:52

Ich habe mich missverständlich ausgedrückt.
liffi hat geschrieben: Nun möchte ich alle IDs haben, die zu einem bestimmten date keinen Wert haben.
Damit wollte ich ausdrücken, dass diese Datensätze gar nicht existieren (ja, das hätte ich wesentlich besser formulieren können).

Im Prinzip brauche ich ja dann eine Liste alle vorkommenden IDs. Dann eine Liste der IDs, die am 10.01.2013 einen Wert besitzen. Dann muss ich nur noch die zweite Liste von der ersten 'abziehen'.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von syssi » 01.02.2013 10:13:51

Kannst du mal ein Beispiel auffuehren mit drei Beispieldatensaetzen? Ist der Primary-Key fortlaufend oder gibt es "Loecher"?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von Liffi » 01.02.2013 10:26:54

syssi hat geschrieben:Kannst du mal ein Beispiel auffuehren mit drei Beispieldatensaetzen? Ist der Primary-Key fortlaufend oder gibt es "Loecher"?
Ich hab mal die gesamte Struktur abgebildet, inklusive 3 Datensätzen. Der Primary-Key besteht aus einer Kombination von ID und date (die ID verändert sich deswegen *nicht* immer). Im Bespiel gibt es zwei IDs: '1' und '2'. Und zwei Daten (der 09.01.2013 und der 10.01.2013). Beim zweiten Date hat nur ID '1' einen Wert.

Als Wunschergebnis eines MySQL Statements würde jetzt f"ur den 10.01.2013 '2' als ID rauskommen. Also eine Liste aller IDs, die am betreffenden Tag nicht vorhanden sind.

Ich hoffe, ich hab das jetzt ein bisschen informativer erklärt. Scheinbar war ich eben noch zu müde ;-).

Code: Alles auswählen

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `syssi` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `syssi`;

--
-- Table structure for table `test`
--

DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL,
  `value` int(10) NOT NULL,
  PRIMARY KEY (`ID`,`date`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test`
--

LOCK TABLES `test` WRITE;
/*!40000 ALTER TABLE `test` DISABLE KEYS */;
INSERT INTO `test` VALUES (1,'2013-01-09',10),(1,'2013-01-10',12),(2,'2013-01-09',7);
/*!40000 ALTER TABLE `test` ENABLE KEYS */;
UNLOCK TABLES;

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von Liffi » 01.02.2013 14:06:53

So, ich glaube, ich bin der Lösung nahe (oder habe sie schon :-))

Code: Alles auswählen

SELECT DISTINCT ID from test WHERE ID NOT IN(SELECT ID from test where date = '2013-01-10')

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von syssi » 01.02.2013 16:33:36

Sieht gut aus. Vorausgesetzt das Datum ist ueberhaupt einmal in der Datenbank vertreten.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: MySQL: Alle IDs, die an bestimmten Date keine Daten habe

Beitrag von Liffi » 01.02.2013 16:43:04

syssi hat geschrieben:Sieht gut aus. Vorausgesetzt das Datum ist ueberhaupt einmal in der Datenbank vertreten.
Ansonsten werden halt alle IDs ausgegeben. Das sollte auch in dem Fall funktionieren.
Für die Beispieldatenbank:

Code: Alles auswählen

SELECT DISTINCT id from test WHERE id NOT IN(SELECT id from test where date = '2013-01-11');
+----+
| id |
+----+
|  1 |
|  2 |
+----+

Antworten