2
votes

comment afficher la moitié des enregistrements de la table? MYSQL

Je recherche MYSQL QUERY, pas PLSQL QUERY

select *  from aadhar limit (select count(*)/2 from aadhar);

J'ai essayé d'aimer ça mais j'obtiens cette erreur s'il vous plaît aider

Code d'erreur: 1064. Vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de ' (sélectionnez count (*) / 2 depuis aadhar) ' à la ligne 1


1 commentaires

mettez à jour votre question et ajoutez le message d'erreur exact


5 Réponses :


2
votes

Il n'y a aucune disposition dans MySQL pour sélectionner et afficher la moitié du total des enregistrements dans la table jusqu'à ce que vous ne spécifiez pas explicitement le scalaire dans la clause LIMIT.


0 commentaires

3
votes

Peut-être pas ce que vous aimeriez mais- 'Dans les programmes stockés, les paramètres LIMIT peuvent être spécifiés en utilisant des paramètres de routine à valeur entière ou des variables locales à partir de MySQL 5.5.6.' https://dev.mysql.com/doc/refman/5.5/ fr / select.html

SI vous ne voulez pas utiliser SQL dynamique ou une procédure stockée mais que vous avez un moyen de classer votre table puis la simulation du numéro de ligne (avant la version 8) ou la fonction de fenêtre row_number ( version 8 sur) peut aider. Étant donné

+----+----------+
| ID | USERNAME |
+----+----------+
|  1 | aaa      |
|  2 | Jane     |
|  3 | Ali      |
|  6 | Bruce    |
|  7 | Martha   |
|  8 | Sidney   |
| 10 | charlie  |
+----+----------+
7 rows in set (0.00 sec)

entraînera

+-----+----------+
| id  | username |
+-----+----------+
|   1 | aaa      |
|   2 | Jane     |
|   3 | Ali      |
|   6 | Bruce    |
|   7 | Martha   |
|   8 | Sidney   |
|  10 | charlie  |
|  12 | Elisa    |
|  14 | Samantha |
|  15 | Hannah   |
|  16 | Hannah   |
|  17 | Kevin    |
| 999 | bob      |
+-----+----------+
13 rows in set (0.00 sec)

SELECT S.ID,S.USERNAME FROM
(
SELECT U.ID,U.USERNAME,
         @RN:=@RN+1 ROWNUMBER,
         (SELECT ROUND(COUNT(*)/2) FROM USERS) TOPN
FROM USERS U
CROSS JOIN (SELECT @RN:=0) R
ORDER BY U.ID 
) S
WHERE S.ROWNUMBER <= S.TOPN;


3 commentaires

ce n'est pas pour Dans les programmes enregistrés. je veux juste sélectionner les premiers enregistrements de 50% à partir d'une table car je sais que la requête dans PLSQL est select rownum, e. * from aadhar a where rownum <= (select count (*) / 2 from aadhar);


MYSQL n'est pas plsql - il n'y a pas d'équivalent de rownum dans mysql.


Salut P.Salmon. Je sais que PLSQL et MYSQL sont différents. ici, je dois connaître la requête équivalente pour obtenir les premiers 50% des enregistrements d'une table



3
votes

Comme les autres réponses déjà expliquées, LIMIT ne peut pas être défini dynamiquement dans une requête.
Mais vous pouvez le contourner avec une variable utilisateur MySQL en combinaison avec PREPARE / EXECUTE ..

SET @count = (SELECT COUNT(*)/2 FROM aadhar); 

PREPARE q FROM 'SELECT * FROM aadhar LIMIT ?';
EXECUTE q USING @count;
DEALLOCATE PREPARE q;

Ou ( option la plus sûre )

SET @count = (SELECT COUNT(*)/2 FROM aadhar); 
SET @sql = CONCAT('SELECT * FROM aadhar LIMIT ', @count);

PREPARE q FROM @sql;
EXECUTE q;
DEALLOCATE PREPARE q;

Avertissement supplémentaire

Veuillez noter que SQL est par définition sans ordre . Utiliser LIMIT sans ORDER BY n'a aucun sens . SQL est libre de renvoyer les enregistrements ce qui correspond dans l'ordre d'année qu'il souhaite sans ORDER BY , ce qui signifie que l'exécution de la même requête deux fois peut entraîner un résultat différent.

Il est également préférable d'utiliser CEIL () ou CAST () qui convertit un double en un int afin que les méthodes ne se trompent pas lorsque la table a un nombre impair hors enregistrements et génère du SQL avec un double comme celui-ci SELECT * FROM aadhar LIMIT 1.500000000

voir démo sur la façon de les faire


0 commentaires

-1
votes

Essayez ceci:

select *  from aadhar limit ((select count(*) from aadhar)/2);

La clause count renvoie le nombre d'enregistrements, et la moitié de cette valeur est prise en limite.


0 commentaires

0
votes

Vous pouvez y parvenir en utilisant des variables.

SELECT  @s:=@s+1 id,a.*
FROM    aadhar a,
        (SELECT @s:= 0) AS s where @s < (SELECT count(*)/2 from aadhar a2)

Ici '@s' est une variable et en ajoutant un identifiant de création qui est auto-incrémenté. Où condition stocke la moitié de votre nombre total d'enregistrements et @s s'arrête juste après avoir atteint la limite de la moitié de votre enregistrement.


0 commentaires