Avatar billede fizk Nybegynder
15. november 2005 - 10:49 Der er 26 kommentarer og
1 løsning

Lidt mere eller lidt mindre, plus-minus et par stykker

Jeg leder efter en sql sætning der er konstrueret således at den udvælger alle tal fra en database +/- et par stykker...

Lidt forklaring:
Jeg har en masse billeder i en database (dvs. deres filnavn) og hvor brede/høje de er, hvor jeg så laver en SELECT DISTINCT `w`,`h` FROM `blabla` WHERE 1, dette giver mig så alle de forskellige bredde/højder der er og smider dem ind i en liste - men nogen af billederne er 100*100 og nogen er 101*101, kan jeg ikke på en eller anden måde få dem der ligger inden for en margin på f.eks. 5 pixels med i min oprindelige SQLsætning?
Avatar billede fennec Nybegynder
15. november 2005 - 10:58 #1
select * from enTabel where width>=100-5 and width<=100+5 and height>=100-5 and height<=100+5
Avatar billede fizk Nybegynder
15. november 2005 - 11:03 #2
Dvs. at jeg skal have en sql-sætning inden i en sql-sætning og det ikke kan lade sig gøre at smide det hele ind i én stor fælles løsning?
Avatar billede fennec Nybegynder
15. november 2005 - 12:26 #3
Det kan ikke smides ind i en stor. Se f.eks dette eks:

width height
100    100
104    104
108    108

Hvordan forventer du den skal "gruppere" dem med +/- 5?? Du har jo ikke noget der indikere at 100 er primær, og hvis det er 105 bliver alle 3 samlet til en..

Det lyder lidt til at du skal udvælge inden for bestemte områder i stedet:
select * from enTabel where width>=0 and width<=19
select * from enTabel where width>=20 and width<=39
select * from enTabel where width>=40 and width<=59
...

Disse områder kan du evt have liggende i en tabel, som så kan joines.
Avatar billede fizk Nybegynder
15. november 2005 - 15:56 #4
Hm, nå det må jeg så gøre ...
Der er jo så mange muligheder med sql, så det kunne da godt være de havde taget højde for det på en eller anden måde!
Avatar billede fennec Nybegynder
15. november 2005 - 16:40 #5
Desværre ikke :(

.o) <-- One Eyed Jack
Avatar billede arne_v Ekspert
15. november 2005 - 20:10 #6
måske er der alligevel visse muligheder lidt afhængig af præcis hvad du vil

eksempel:


mysql> CREATE TABLE dim (
    ->    id INTEGER PRIMARY KEY,
    ->    w INTEGER,
    ->    h INTEGER
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> INSERT INTO dim VALUES (1,100,100);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO dim VALUES (2,104,104);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO dim VALUES (3,108,108);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT *
    -> FROM dim;
+----+------+------+
| id | w    | h    |
+----+------+------+
|  1 |  100 |  100 |
|  2 |  104 |  104 |
|  3 |  108 |  108 |
+----+------+------+
3 rows in set (0.00 sec)

mysql>
mysql> SELECT ((w + 5) DIV 10)*10,((w + 5) DIV 10)*10,COUNT(*)
    -> FROM dim
    -> GROUP BY ((w + 5) DIV 10)*10,((w + 5) DIV 10)*10;
+---------------------+---------------------+----------+
| ((w + 5) DIV 10)*10 | ((w + 5) DIV 10)*10 | COUNT(*) |
+---------------------+---------------------+----------+
|                100 |                100 |        2 |
|                110 |                110 |        1 |
+---------------------+---------------------+----------+
2 rows in set (0.00 sec)

mysql>
mysql> SELECT *
    -> FROM dim
    -> WHERE ((w + 5) DIV 10)*10=100 AND ((h + 5) DIV 10)*10=100;
+----+------+------+
| id | w    | h    |
+----+------+------+
|  1 |  100 |  100 |
|  2 |  104 |  104 |
+----+------+------+
2 rows in set (0.00 sec)
Avatar billede fizk Nybegynder
15. november 2005 - 21:27 #7
Jouw, det ser da ud til at gøre et eller andet, men hvad er det jeg skal pille ved for at får margin'en til at blive større?
Jeg har prøvet at skrue op for den du har sat til 5, men synes ikke rigtigt det hjælper, kan det passe?
Avatar billede arne_v Ekspert
15. november 2005 - 21:29 #8
+/-5 er +5 DIV 10
+/-10 er +10 DIV 20
+/-20 er + 20 DIV 40
Avatar billede fizk Nybegynder
15. november 2005 - 21:31 #9
Hov ... Havde ikke lige set den ekstra forespørgsel, men den gør jo ingenting andet end at vælge nogen bestemte hvor jeg skal kende bredden?
Avatar billede fizk Nybegynder
15. november 2005 - 21:32 #10
Ok, nu er jeg helt lost ... arne_v, lidt nærmere forklaring udbedes!!
Avatar billede arne_v Ekspert
15. november 2005 - 21:33 #11
måske er det

SELECT DISTINCT ((w + 5) DIV 10)*10,((w + 5) DIV 10)*10
FROM dim

du vil - jeg forstår ikke helt hvad du vil have ud
Avatar billede arne_v Ekspert
15. november 2005 - 21:33 #12
kan du prøve at vise nogle data - bare en 4-5 række rog det output du vil have ud ?
Avatar billede fizk Nybegynder
15. november 2005 - 21:35 #13
Den giver en fejl med DIV (har bare gået ud fra at DIV skulle være det samme som at dividere med ...

#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DIV  '10' ) *10, ( ( w +5 )
DIV  '10' ) *10
FROM  `mobil`  LIMI

Jeg er forvirret...
Avatar billede arne_v Ekspert
15. november 2005 - 21:37 #14
hvordan ser din SQL ud ?
Avatar billede fizk Nybegynder
15. november 2005 - 21:41 #15
Jeg har den her side http://esbenboye.dk/mobil/index2.php?left=billeder&right=preview
Og som det ses, har jeg sorteret dem i listen efter bredde/højde.
Der er nogen af dem der kun adskiller sig med 2-3-4 pixels, dem vil jeg gerne have i samme pulje, altå, så dem der er 120,121 og 123 pixels brede/høje kommer i samme pulje!

Mine rækker:
  id          fil    w      h
+-----+-----------+-----+------+
| 1  | 008.jpg  | 128 | 128  |
| 2  |simps.gif  | 127 | 128  |
| 3  |xfiles.jpg | 128 | 129  |
| 4  |billede.jpg| 230 | 200  |
+-----+-----------+-----+------+
Og der er det så jeg gerne vil have 008.jpg, simps.gif og xfiles.jpg til at blive spyttet ud i samme pulje, så jeg på listen har en der hedder f.eks. 127*128, så det passer sådan så nogenlunde...
Håber det forklarer lidt bedre!
Avatar billede fizk Nybegynder
15. november 2005 - 21:43 #16
Jeg har prøvet med en SQL der ser således ud
SELECT ((`w` + 5) DIV 10)*10,((`w` + 5) DIV 10)*10,COUNT(*) FROM `mobil` GROUP BY ((`w` + 5) DIV 10)*10,((`w` + 5) DIV 10)*10;
og den giver den førnævnte fejl ved DIV...
Avatar billede arne_v Ekspert
15. november 2005 - 21:45 #17
du skal vel bruge w og h ikke w og w !?!?
Avatar billede arne_v Ekspert
15. november 2005 - 21:45 #18
er w og h integer felter ?
Avatar billede fizk Nybegynder
15. november 2005 - 21:47 #19
Ja, jeg skal bruge `h` og `w` (giver stadig samme fejl) og de er begge sat til int(11) felter...
Avatar billede arne_v Ekspert
15. november 2005 - 21:48 #20
hvilken MySQL version ?
Avatar billede fizk Nybegynder
15. november 2005 - 21:49 #21
Bumelum, hvor ser jeg hvilken version det er?
Avatar billede fizk Nybegynder
15. november 2005 - 21:51 #22
Der var lige en flink medarbejder der sagde det er version der her de kører: 4.0.24_Debian-10sarge1-log ...
Avatar billede arne_v Ekspert
15. november 2005 - 21:53 #23
DIV kræver 4.1 eller 5.0
Avatar billede arne_v Ekspert
15. november 2005 - 21:55 #24
men så prøver du at erstatte

((w + 5) DIV 10)*10

med

floor((w + 5)/10)*10
Avatar billede arne_v Ekspert
15. november 2005 - 21:55 #25
og tilsvarende for de andre 3 beregninger
Avatar billede arne_v Ekspert
19. november 2005 - 00:24 #26
fizk ?
Avatar billede arne_v Ekspert
31. december 2005 - 14:54 #27
??

og et svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester