2017-10-15 3 views
-3

Ich bin ein Anfänger in MySQL. Die folgenden Codes sehen blöd aus, aber deshalb können meine Codes nicht funktionieren. Ich dachte, es würde mir n Zeilen geben. Allerdings gab es mir nur eine Zeile. Angenommen, es gibt n Zeilen in der Tabelle seat, und es gibt zwei Felder einschließlich ID, Student.SQL-Anzahl (*) gibt nur eine Zeile zurück

Ich verstehe, Count (*) wird eine Zahl zurückgeben. Ich dachte, dass sql für jede Zeile prüft, ob id der Gesamtzahl der Zeilen entspricht. Aber es tat es nicht.

select id = count(*) as id, student 
from seat 

Die folgenden Codes taten, was ich wollte. Könnte jemand erklären, was sie dazu bringt, andere Ergebnisse zu geben?

select id = count2 as id, student 
from seat, (select count(*) as count2 from seat) seat2 
+0

Was möchten Sie erreichen? – user1506104

+0

aus dem Grund, warum es Ihnen nur eine Zeile gab, bitte hier überprüfen: http://www.mysqltutorial.org/mysql-count – user1506104

+1

Sie sollten die Anzahl mit der Gruppe nach Abschnitt im Tutorial –

Antwort

0

Ich glaube, Sie so etwas wie dies versuchen sollte:

select id = (select count(*) from seat) as id, student 
from seat 

Grundsätzlich Ihre vorherige Anforderung mit dieser Aussage in der FROM-Klausel (select count(*) as count2 from seat) gibt nur Sie rudern, damit es nicht auf alle Ihre Zeilen vergleichen weil Sie es in Ihrer FROM-Klausel zwei Tabellen Platz und Platz 2 ohne die gleiche Anzahl von Zeilen setzen.

Ich denke, dass Sie nicht zwei Tabellen verwenden müssen.

0

One way:

set @num := (select count(*) from seat); 

select 
     id 
    , student 
    , case when id = @num then 'special' else 'normal' end as x 
from seat 

Ein anderer Weg:

select 
     id 
    , student 
    , case when id = x.y then 'special' else 'normal' end as x 
from seat 
cross join (select count(*) as y from seat) as x 
; 

NB: In beiden Beispielen müssen Sie die Unterabfrage nur einen Wert in einer Zeile zurückzukehren.

0

Gegeben

+----+----------+ 
| id | lastname | 
+----+----------+ 
| 1 | aaa  | 
| 2 | bbb  | 
| 3 | ccc  | 
+----+----------+ 
3 rows in set (0.00 sec) 

Ihre erste Abfrage ist eine Anweisung an mysql über den gesamten Satz zu zählen

MariaDB [sandbox]> select id = count(*) as id, lastname 
    -> from users; 
+------+----------+ 
| id | lastname | 
+------+----------+ 
| 0 | aaa  | 
+------+----------+ 
1 row in set (0.00 sec) 

Offensichtlich dies nicht die letzte ID oder die richtige Anzahl zurückgibt. Die korrekte Zählung würde von diesem

select id, lastname , count(*) 
from users; 
+------+----------+----------+ 
| id | lastname | count(*) | 
+------+----------+----------+ 
| 1 | aaa  |  3 | 
+------+----------+----------+ 
1 row in set (0.00 sec) 

zurückgegeben werden Und die ID und Nachname sind unbestimmt.

Ihre zweite Abfrage gibt ein kartesisches Produkt

select id = count2, lastname, count2 
    -> from users, (select count(*) as count2 from users) seat2 
    -> ; 
+-------------+----------+--------+ 
| id = count2 | lastname | count2 | 
+-------------+----------+--------+ 
|   0 | aaa  |  3 | 
|   0 | bbb  |  3 | 
|   1 | ccc  |  3 | 
+-------------+----------+--------+ 
3 rows in set (0.00 sec) 

die wiederum nicht die ID nicht identifizieren, die die Zählung übereinstimmt ..

die ID eine Nummer und Schritte in irgendeiner Art und Weise ist eine Art und Weise Unter der Annahme, das tut findet die letzte ID ist

MariaDB [sandbox]> select id,lastname 
    -> from users 
    -> where id = (select count(*) from users); 
+----+----------+ 
| id | lastname | 
+----+----------+ 
| 3 | ccc  | 
+----+----------+ 
1 row in set (0.00 sec) 

Aber das ist gefährlich - wenn id auto_increment dann die Anzahl der Zeilen möglicherweise nicht überein, die id wegen der Art und Weise au ist to_increment wird behandelt (es kann überschrieben werden, fügt das Update für den doppelten Schlüssel usw. ein)) Ein sicherer Weg ist, um

MariaDB [sandbox]> select id,lastname 
    -> from users 
    -> where id = (select max(id) from users); 
+----+----------+ 
| id | lastname | 
+----+----------+ 
| 3 | ccc  | 
+----+----------+ 
1 row in set (0.00 sec) 
0

Ich dachte, es [count (*)] mir geben würde n Zeilen. Allerdings gab es mir nur eine Zeile.

Nein. Sie verwenden COUNT(*) ohne GROUP BY. Das macht Ihre Abfrage zu einer Sammelanfrage. Eine Aggregationsabfrage ohne GROUP BYimmer gibt eine Zeile zurück - auch wenn in der Tabelle keine Zeilen vorhanden sind.

Ihre Abfrage wäre in fast jeder anderen Datenbank (und in der Standardkonfiguration zukünftiger MySQL-Versionen) ungültig, weil Sie eine Aggregationsabfrage haben und die Spalte id weder in der GROUP BY noch ein Argument für eine Aggregationsfunktion ist.

In MySQL, wahrscheinlich der einfachste Weg, was Sie zu tun beabsichtigen verwendet eine Unterabfrage:

select id = (select count(*) from seat) as id, student 
from seat 

Ich habe keine Ahnung, warum Sie das boolean Ergebnis id, nennen wollen, aber das ist, was Ihre ursprüngliche Abfrage zum Ausdruck bringt .

Fazit: Sie müssen Aggregation Abfragen üben und schauen, was GROUP BY tut.

Verwandte Themen