Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1585 connectés 

 



Débat n°1




Attention si vous cliquez sur "voir les résultats" vous ne pourrez plus voter

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  18  19  20  21  22  23
Page Suivante
Auteur Sujet :

BlaBla@SQL

n°2342926
rufo
Pas me confondre avec Lycos!
Posté le 11-12-2019 à 13:25:24  profilanswer
 

Reprise du message précédent :

eclaireur a écrit :

Faire la mise en forme par le SGBD ça reste pas le top :/


C'est pas idiot sa bidouille. Il se sert de cette "mise en forme" pour juste récupérer les valeurs associées à a et la date/heure. Comme la date/heure est convertie en chaîne et est situées en début de chaîne, le MAX va faire une sorte de tri des chaînes obtenues par ordre alphabétique. Mécaniquement, ça sera celle qui a la date/heure la plus élevée qui va ressortir car stockée au format YYYYMMDDHHMMSS.
 
Je me note cette bidouille en tout cas. Dans certains cas, ça peut être plus intéressant qu'une autojointure avec sous-requête...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
mood
Publicité
Posté le 11-12-2019 à 13:25:24  profilanswer
 

n°2342934
bosstime
H1N1 ready
Posté le 11-12-2019 à 15:59:55  profilanswer
 

Ca reste une bidouille :D
 
Le mieux est la 2ème version dans ce cas, window function mais en agrégeant sur la PK plutôt que le champs time. Ca évite d'avoir à coller un index sur time et sur des tables de plusieurs centaines de millions de lignes ca n'est pas négligeable.
 
Mais window function, ou table temporaire avec auto jointure, ca revient quasiment au même amha: Dans tous les cas tu dois agréger dans un premier temps et récupérer le reste ensuite. A confirmer avec le plan d'exécution :)
 

n°2343432
rokin-k
Posté le 19-12-2019 à 17:06:37  profilanswer
 

Salut, j'ai ressorti un vieux code que j'avais fait et j'aurai une question sur une base SQLite, me jugez pas je suis pas un pro  :o  
 
J'ai une table comme ceci :

Code :
  1. CREATE TABLE if not exists host(
  2.                 id INTEGER primary key unique,
  3.                 ip TEXT,
  4.                 ripe INTEGER,
  5.                 date TEXT DEFAULT CURRENT_TIMESTAMP,
  6.                 auth TEXT DEFAULT NULL,
  7.                 FOREIGN KEY(ripe) REFERENCES ripe(id) ON UPDATE CASCADE
  8.             );


J'ajoute (ou) met à jour un enregistrement avec une seul requête de ce style :

Code :
  1. SQL.execute('INSERT OR REPLACE INTO host (id, ip, ripe, date) VALUES ((SELECT id FROM host WHERE ip = ?), ?, ?, CURRENT_TIMESTAMP)', (address, address, routes[0]))


 Cela (me semble) correct et cela (semble) fonctionner .
 
 
Maintenant, sachant qu'un ip est unique dans mon cas,  
Est-ce que cela serait correct/similaire de plutôt faire :

Code :
  1. CREATE TABLE if not exists host(
  2.                 id INTEGER primary key unique,
  3.                 ip TEXT unique,
  4.                 ripe INTEGER,
  5.                 date TEXT DEFAULT CURRENT_TIMESTAMP,
  6.                 auth TEXT DEFAULT NULL,
  7.                 FOREIGN KEY(ripe) REFERENCES ripe(id) ON UPDATE CASCADE
  8.             );


Code :
  1. SQL.execute('INSERT OR REPLACE INTO host (ip, ripe, date) VALUES (?, ?, CURRENT_TIMESTAMP)', (address, routes[0]))


en gros, ça évite donc d’imbriquer 2 reqs ?! [:odµsseus:2]
 
 
Edit : wai bon hfr a fait péter toute la mise en page de mon post  :o  :o  :o

Message cité 1 fois
Message édité par rokin-k le 19-12-2019 à 17:12:07

---------------
Diablo3
n°2343433
eclaireur
Posté le 19-12-2019 à 17:09:31  profilanswer
 

rokin-k a écrit :

Salut, j'ai ressorti un vieux code que j'avais fait et j'aurai une question sur une base SQLite, me jugez pas je suis pas un pro  :o  
 
J'ai une table comme ceci :

Code :
  1. CREATE TABLE if not exists host(


                id INTEGER primary key unique,                ip TEXT,                ripe INTEGER,                date TEXT DEFAULT CURRENT_TIMESTAMP,                auth TEXT DEFAULT NULL,                FOREIGN KEY(ripe) REFERENCES ripe(id) ON UPDATE CASCADE            );  
J'ajoute (ou) met à jour un enregistrement avec une seul requête de ce style :

Code :
  1. SQL.execute('INSERT OR REPLACE INTO host (id, ip, ripe, date) VALUES ((SELECT id FROM host WHERE ip = ?), ?, ?, CURRENT_TIMESTAMP)', (address, address, routes[0]))


 Cela (me semble) correct et cela (semble) fonctionner .
 
Sachant qu'un ip est unique dans mon cas,  
Est-ce que cela serait correct/similaire de plutôt faire :

Code :
  1. CREATE TABLE if not exists host(


                id INTEGER primary key unique,                ip TEXT unique,                ripe INTEGER,                date TEXT DEFAULT CURRENT_TIMESTAMP,                auth TEXT DEFAULT NULL,                FOREIGN KEY(ripe) REFERENCES ripe(id) ON UPDATE CASCADE            );
 

Code :
  1. SQL.execute('INSERT OR REPLACE INTO host (ip, ripe, date) VALUES (?, ?, CURRENT_TIMESTAMP)', (address, routes[0]))


 
en gros, ça évite donc d’imbriquer 2 reqs ?! [:odµsseus:2]


 
Ta première solution est naze en effet.
 
La seconde est meilleure, mais en SQLlite tu peux mettre l’unicité comme contrainte externe à la table ?  
C’est plus facile à manier

n°2343439
rokin-k
Posté le 19-12-2019 à 18:06:00  profilanswer
 

J'ai refait la mise en page, ta contre question m'a un peu perdu par contre :o
Là je suis noyé dans 50 onglets d'ouverts à essayer de comprendre.
 
Je pense qu'à la base j'avais fait ça dans le but de faire un pseudo "INSERT OR UPDATE" qui n'existe pas, dans le but de conserver le même "id primary key" plutôt qu'en recréer un autre avec un "INSERT OR REPLACE" car à relire mon code tel qu'il est actuellement cela va posé des problèmes pour la suite.  
 
J'avais du m'inspirer d'une discussion du genre https://stackoverflow.com/questions [...] lse-update :D
Je vois qu'il existe UPSERT et qui pourrait peu être être la solution: https://stackoverflow.com/questions [...] -or-insert


Message édité par rokin-k le 19-12-2019 à 18:07:28

---------------
Diablo3
n°2343443
rokin-k
Posté le 19-12-2019 à 18:58:48  profilanswer
 

Je m’auto réponds, à priori en faisant comme ça, cela devrais être mieux / plus propre / suffisant, que l'original :

Code :
  1. CREATE TABLE if not exists host(
  2.                 ...
  3.                 ip TEXT unique,
  4.                 ...
  5.             );


 

SQL.execute('INSERT INTO host (ip, ripe, date) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(ip) DO UPDATE SET date = CURRENT_TIMESTAMP', (address, routes[0]))


---------------
Diablo3
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  18  19  20  21  22  23
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Requete SQL de selection complexe[SQL SERVER] Ajout d'une colonne en PS...mais inutilisable
[ODBC] DSN pour se connecter à une base SQL[PDO/SQL] Aide selection et classement (JOIN ??)
Problème conditions requete SQLSQL/PHP BDD de réservation de chambres
Jointure 'LIKE' SQL => BOtable SQL Ajouter une colonne au lieu de creer une nouvelle table
Requête SQL complexe 
Plus de sujets relatifs à : BlaBla@SQL


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR