Hier ist meine Tabelle und die darin enthaltenen Daten:Was passiert bei der Verwendung von DISTINCT?
Table: first
+----------+------+
| first_id | data |
+----------+------+
| 1 | 5 |
| 2 | 6 |
| 3 | 7 |
| 4 | 6 |
| 5 | 7 |
| 6 | 5 |
| 7 | 7 |
| 8 | 6 |
| 9 | 5 |
| 10 | 7 |
+----------+------+
Table: second
+-----------+----------+----------+
| second_id | first_id | third_id |
+-----------+----------+----------+
| 1 | 1 | 2 |
| 2 | 2 | 3 |
| 3 | 3 | 4 |
| 4 | 4 | 2 |
| 5 | 5 | 3 |
| 6 | 6 | 4 |
| 7 | 7 | 2 |
| 8 | 8 | 2 |
| 9 | 9 | 4 |
| 10 | 10 | 4 |
+-----------+----------+----------+
Meine Absicht ist es, die Liste der third_id
s von data
Feld bestellt zu bekommen. Jetzt habe ich die folgende Abfrage ausgeführt.
SELECT
third_id, data
FROM
first f JOIN second s ON (s.first_id = f.first_id)
ORDER BY
data ASC;
Und ich bekomme das folgende Ergebnis wie erwartet.
+----------+------+
| third_id | data |
+----------+------+
| 4 | 5 |
| 2 | 5 |
| 4 | 5 |
| 2 | 6 |
| 3 | 6 |
| 2 | 6 |
| 2 | 7 |
| 4 | 7 |
| 4 | 7 |
| 3 | 7 |
+----------+------+
Die folgende Abfrage funktioniert auch wie erwartet.
SELECT
third_id
FROM
first f JOIN second s ON (s.first_id = f.first_id)
ORDER BY
data ASC;
mit Ausgang
+----------+
| third_id |
+----------+
| 4 |
| 2 |
| 4 |
| 2 |
| 3 |
| 2 |
| 2 |
| 4 |
| 4 |
| 3 |
+----------+
Dann lief ich die folgenden.
SELECT DISTINCT
third_id
FROM
first f JOIN second s ON (s.first_id = f.first_id)
ORDER BY
data ASC;
Aber hier bekomme ich ein unerwartetes Ergebnis:
+----------+
| third_id |
+----------+
| 2 |
| 3 |
| 4 |
+----------+
Hier 3
müssen nach 2
und 4
, da ich auf dem data
Feld bin der Bestellung. Was mache ich falsch? Oder muss ich eine andere Strategie wählen?
Hinweis: Dieses Szenario passiert bei meinem Projekt. Die hier bereitgestellten Tabellen gehören nicht zur ursprünglichen Datenbank. Es ist von mir erstellt, um das Problem zu erklären. Originaltabellen enthalten Tausende von Zeilen. ich Datenbank-Dump bin Einfügen, wenn Sie mit den Daten experimentieren möchten:
--
-- Table structure for table `first`
--
CREATE TABLE IF NOT EXISTS `first` (
`first_id` int(11) NOT NULL AUTO_INCREMENT,
`data` int(11) NOT NULL,
PRIMARY KEY (`first_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
--
-- Dumping data for table `first`
--
INSERT INTO `first` (`first_id`, `data`) VALUES
(1, 5),
(2, 6),
(3, 7),
(4, 6),
(5, 7),
(6, 5),
(7, 7),
(8, 6),
(9, 5),
(10, 7);
--
-- Table structure for table `second`
--
CREATE TABLE IF NOT EXISTS `second` (
`second_id` int(11) NOT NULL AUTO_INCREMENT,
`first_id` int(11) NOT NULL,
`third_id` int(11) NOT NULL,
PRIMARY KEY (`second_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
--
-- Dumping data for table `second`
--
INSERT INTO `second` (`second_id`, `first_id`, `third_id`) VALUES
(1, 1, 2),
(2, 2, 3),
(3, 3, 4),
(4, 4, 2),
(5, 5, 3),
(6, 6, 4),
(7, 7, 2),
(8, 8, 2),
(9, 9, 4),
(10, 10, 4);
"Aber, hier bekomme ich ein unerwartetes Ergebnis:" - Das ist nicht unerwartet. –
@MitchWheat Aber wie? – Jomoos
Wenn ich sql wäre, würde ich diese 'ORDER BY'-Klausel ablehnen, aber' mysql' ist dafür notorisch tolerant. Mit welchen Daten möchten Sie bestellen? –