|
| MySQL: find nærmeste højere værdi? Fra : Tonni Aagesen |
Dato : 17-10-01 18:22 |
|
Hejsa NG,
En tabel ser sådan ud:
ID Tal
1 2
2 8
3 5
4 4
5 11
Hvis jeg så har en værdi f.eks "3", hvordan får jeg så resultatet af en
query til at være "4".
Eks: ("SELECT ID FROM table WHERE Tal >= 3 LIMIT 1"); vil, så vidt jeg ved,
returnere "ID = 3" da den første række i tabellen med "Tal > 3" har "ID =
3". Men i mit tilfælde skal jeg bruge den nærmeste højere værdi, altså
rækken med "ID = 4" og "Tal = 4".
Hvad skriver jeg i SQL sætningen??
--
Mvh
Tonni Aagesen
agent29@mail1.stofanet.dk
| |
Kim Petersen (17-10-2001)
| Kommentar Fra : Kim Petersen |
Dato : 17-10-01 18:26 |
|
"Tonni Aagesen" <use.my@signature.com> writes:
> Hejsa NG,
>
> En tabel ser sådan ud:
>
> ID Tal
> 1 2
> 2 8
> 3 5
> 4 4
> 5 11
>
> Hvis jeg så har en værdi f.eks "3", hvordan får jeg så resultatet af en
> query til at være "4".
>
> Eks: ("SELECT ID FROM table WHERE Tal >= 3 LIMIT 1"); vil, så vidt jeg ved,
> returnere "ID = 3" da den første række i tabellen med "Tal > 3" har "ID =
> 3". Men i mit tilfælde skal jeg bruge den nærmeste højere værdi, altså
> rækken med "ID = 4" og "Tal = 4".
>
> Hvad skriver jeg i SQL sætningen??
SELECT min(ID) FROM table WHERE Tal >= 3;
Og i tilfælde af at den _skal_ være større...
SELECT min(ID) FROM table WHERE Tal > 3;
Hehe
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Nis Jorgensen (18-10-2001)
| Kommentar Fra : Nis Jorgensen |
Dato : 18-10-01 09:30 |
|
On Wed, 17 Oct 2001 19:21:32 +0200, "Tonni Aagesen"
<use.my@signature.com> wrote:
>
>En tabel ser sådan ud:
>
>ID Tal
>1 2
>2 8
>3 5
>4 4
>5 11
>
>Hvis jeg så har en værdi f.eks "3", hvordan får jeg så resultatet af en
>query til at være "4".
SELECT 4;
Ah, du vil have den til at være afhængig af værdien (3) og af tabellen
>Eks: ("SELECT ID FROM table WHERE Tal >= 3 LIMIT 1"); vil, så vidt jeg ved,
>returnere "ID = 3" da den første række i tabellen med "Tal > 3" har "ID =
>3". Men i mit tilfælde skal jeg bruge den nærmeste højere værdi, altså
>rækken med "ID = 4" og "Tal = 4".
Jeg forstår ikke dit eksempel. Men jeg tror jeg forstår dit problem.
Havde du haft subqueries, ville der være flere muligheder. Men prøvÆ
SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
Bemærk for øvrigt forskellen på ">=" og ">"
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Kristian Damm Jensen (18-10-2001)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 18-10-01 17:40 |
|
Nis Jorgensen wrote:
<snip>
> SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
Nej, nej, nej!
Hvorfor sortere hele mellemresultatet (potentielt hele tabellen) frem
for at lade optimizeren og det relevante index gøre arbejdet?
Som Kim Petersen skrev:
SELECT min(ID) FROM table WHERE Tal >= 3
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts does.
| |
Nis Jorgensen (19-10-2001)
| Kommentar Fra : Nis Jorgensen |
Dato : 19-10-01 10:19 |
|
On Thu, 18 Oct 2001 18:39:56 +0200, Kristian Damm Jensen
<kristian-damm.jensenRE@MOVEcgey.com> wrote:
>
>> SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
>
>Nej, nej, nej!
>
>Hvorfor sortere hele mellemresultatet (potentielt hele tabellen) frem
>for at lade optimizeren og det relevante index gøre arbejdet?
Hvorfor gøre optimizerens arbejde for den?
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Adam Sjøgren (18-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 18-10-01 17:43 |
|
On Wed, 17 Oct 2001 19:21:32 +0200, Tonni Aagesen wrote:
> En tabel ser sådan ud:
> ID Tal
> 1 2
> 2 8
> 3 5
> 4 4
> 5 11
> Hvis jeg så har en værdi f.eks "3", hvordan får jeg så resultatet af
> en query til at være "4".
> Eks: ("SELECT ID FROM table WHERE Tal >= 3 LIMIT 1"); vil, så vidt
> jeg ved, returnere "ID = 3" da den første række i tabellen med "Tal
> > 3" har "ID = 3".
Nej.
Den vil returnere 2, 3, 4 eller 5 som MySQL nu har lyst til det.
"select id from tabel where tal>=3;" giver dig alle de id'er hvor det
tilhørende tal er større end tre. I vilkårlig rækkefølge.
Eks:
mysql> select id from tabel where tal>=3;
+------+
| id |
+------+
| 5 |
| 2 |
| 3 |
| 4 |
+------+
Når du tilføjer "limit 1", får du det af tallene som MySQL nu
tilfældigvis fandt praktisk at vise først.
Eks:
mysql> select id from tabel where tal>=3 limit 1;
+------+
| id |
+------+
| 5 |
+------+
(og det kan ændre sig fra gang til gang uden at det betyder at der er
noget galt med MySQL).
Du skal have noget sortering ("order by") ind over.
Hvad du egentlig ønsker er ikke klart ud fra dit spørgsmål. Prøv at
formulere det klarere.
Hvis det du vil er, at finde det første id hvis tilhørende tal er
større end 3, så er det vel bare:
mysql> select id from tabel where tal>3 order by tal limit 1;
+------+
| id |
+------+
| 4 |
+------+
?
Mvh.
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Tonni Aagesen (21-10-2001)
| Kommentar Fra : Tonni Aagesen |
Dato : 21-10-01 01:32 |
|
Hold da op!! Har ikke lige tjekket tråden de sidste dage - men tak for
entusiasmen allesammen!
"Adam Sjøgren" <asjo@koldfront.dk> skrev i en meddelelse
news:87pu7kkig8.fsf@virgil.koldfront.dk...
> (og det kan ændre sig fra gang til gang uden at det betyder at der er
> noget galt med MySQL).
Det var præcis det jeg ville vide
> Hvad du egentlig ønsker er ikke klart ud fra dit spørgsmål. Prøv at
> formulere det klarere.
Tabellen er en slags arrangementskalender, hvor hver række jo så er et
arrangement. Tabellen ser delvist ud som følger:
id dato tid
1 2001-10-10 19:30
2 2001-10-12 19:00
3 2001-10-10 20:00
- hvor DATO er "år-måned-dag". Jeg skal så finde det næstkommende
arrangement, men kan ikke bruge eks. dette:
(SELECT * FROM table WHERE dato >= "i dag" AND tid >= "NU!") - hvis der ikke
er nogle arrangementer "i dag" vil den så rigtigt nok finde næste
arrangement rent datomæssigt, men da arrangementet ikke er samme dag, er det
jo ligegyldigt hvilket tidspunkt arrangementet løber af stablen og så er det
jo ikke smart at sætte en betingelse på tid - forstår I?
Jeg har løst problemet på en snirklet, men dog brugbar måde, ved at udføre 2
queries. Den første finder ud af om der er et arrangement "i dag", den næste
er så betinget af den første query. Hmm... I får da lige det hele
$result = mysql_query ("SELECT * FROM table WHERE dato = $Today AND tid >=
'$Now'", $link);
$num_rows = mysql_num_rows($result);
if ($num_rows == 0) {
$sql = "SELECT * FROM table WHERE dato > $Today ORDER BY Odato ASC, tid
ASC LIMIT 1";
}
else {
$sql = "SELECT * FROM table WHERE dato >= $Today AND tid >= '$Now' ORDER
BY Odato ASC, tid ASC LIMIT 1";
}
$result1 = mysql_query ($sql, $link)
Rimeligt snirklet som I kan se (jeg er ikke så skrap til SQL) - er der en
nemmere måde???
--
Mvh
Tonni Aagesen
agent29@mail1.stofanet.dk
| |
Kristian Damm Jensen (22-10-2001)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 22-10-01 10:10 |
|
Tonni Aagesen wrote:
>
> Hold da op!! Har ikke lige tjekket tråden de sidste dage - men tak for
> entusiasmen allesammen!
>
> "Adam Sjøgren" <asjo@koldfront.dk> skrev i en meddelelse
> news:87pu7kkig8.fsf@virgil.koldfront.dk...
>
> > (og det kan ændre sig fra gang til gang uden at det betyder at der er
> > noget galt med MySQL).
>
> Det var præcis det jeg ville vide
>
> > Hvad du egentlig ønsker er ikke klart ud fra dit spørgsmål. Prøv at
> > formulere det klarere.
>
> Tabellen er en slags arrangementskalender, hvor hver række jo så er et
> arrangement. Tabellen ser delvist ud som følger:
>
> id dato tid
> 1 2001-10-10 19:30
> 2 2001-10-12 19:00
> 3 2001-10-10 20:00
>
> - hvor DATO er "år-måned-dag". Jeg skal så finde det næstkommende
> arrangement, men kan ikke bruge eks. dette:
>
> (SELECT * FROM table WHERE dato >= "i dag" AND tid >= "NU!") - hvis der ikke
> er nogle arrangementer "i dag" vil den så rigtigt nok finde næste
> arrangement rent datomæssigt, men da arrangementet ikke er samme dag, er det
> jo ligegyldigt hvilket tidspunkt arrangementet løber af stablen og så er det
> jo ikke smart at sætte en betingelse på tid - forstår I?
Ja.
Fænomenet kaldes leksikalsk sortering og kræver at man laver sin
forespørgsel bare en anelse mere avanceret:
SELECT * FROM tabel
WHERE dato = "i dag" AND tid >= "NU!"
or dato > "i dag"
sort by dato, tid
limit 1
(Her er for en gang skyld et tilfælde, hvor jeg vil foretrække limit.
Når det du søger minimum på er delt over to felter og du ikke har adgang
tilsubselects, kan det blive lidt langhåret (unødigt kompliceret) at
klare sig uden.)
<snip>
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts does.
| |
Tonni Aagesen (22-10-2001)
| Kommentar Fra : Tonni Aagesen |
Dato : 22-10-01 13:27 |
|
"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev i en
meddelelse news:3BD3E24B.61ED7949@MOVEcgey.com...
> Ja.
>
> Fænomenet kaldes leksikalsk sortering og kræver at man laver sin
> forespørgsel bare en anelse mere avanceret:
>
> SELECT * FROM tabel
> WHERE dato = "i dag" AND tid >= "NU!"
> or dato > "i dag"
> sort by dato, tid
> limit 1
Skulle der virkelig ikke mere til Mange tak!!
Men hvad nu hvis jeg sætter LIMIT til 3, og der eks. to arrangementer der
opfylder betingelsen: (WHERE dato = "i dag" AND tid >= "NU!") og x antal der
opfylder betingelsen (OR dato > "i dag")??
Vil den så spytte de to arrangementer fra "i dag" og det førstkommende
arrrangement fra "i morgen"??
--
Mvh
Tonni Aagesen
agent29@mail1.stofanet.dk
| |
Kristian Damm Jensen (24-10-2001)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 24-10-01 10:24 |
|
Tonni Aagesen wrote:
>
> "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev i en
> meddelelse news:3BD3E24B.61ED7949@MOVEcgey.com...
>
> > Ja.
> >
> > Fænomenet kaldes leksikalsk sortering og kræver at man laver sin
> > forespørgsel bare en anelse mere avanceret:
> >
> > SELECT * FROM tabel
> > WHERE dato = "i dag" AND tid >= "NU!"
> > or dato > "i dag"
> > sort by dato, tid
> > limit 1
>
> Skulle der virkelig ikke mere til Mange tak!!
>
> Men hvad nu hvis jeg sætter LIMIT til 3, og der eks. to arrangementer der
> opfylder betingelsen: (WHERE dato = "i dag" AND tid >= "NU!") og x antal der
> opfylder betingelsen (OR dato > "i dag")??
>
> Vil den så spytte de to arrangementer fra "i dag" og det førstkommende
> arrrangement fra "i morgen"??
Ja.
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts does.
| |
Adam Sjøgren (18-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 18-10-01 19:40 |
|
On Thu, 18 Oct 2001 18:39:56 +0200, Kristian Damm Jensen wrote:
> Nis Jorgensen wrote: <snip>
>> SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
> Nej, nej, nej!
Jo jo jo.
> Hvorfor sortere hele mellemresultatet (potentielt hele tabellen)
> frem for at lade optimizeren og det relevante index gøre arbejdet?
Fordi det er nødvendigt?
Den ovenstående og den nedenstående stump SQL giver ikke samme
resultat*.
> Som Kim Petersen skrev:
> SELECT min(ID) FROM table WHERE Tal >= 3
Dette giver nemlig:
mysql> SELECT min(ID) FROM tabel WHERE Tal >= 3;
+---------+
| min(ID) |
+---------+
| 2 |
+---------+
Hvor det første giver:
mysql> SELECT ID FROM tabel WHERE Tal >= 3 ORDER BY Tal LIMIT 1;
+------+
| ID |
+------+
| 4 |
+------+
Mvh.
Adam.
(*: Med mindre da at der gælder hvis et id er større end et andet, så
er det tilhørende tal også, og det gælder ihvertfald ikke for
eksemplet i den oprindelige artikel (f.ex. (2, 8) og (3, 5)).
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Adam Sjøgren (18-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 18-10-01 19:41 |
|
On Thu, 18 Oct 2001 18:39:56 +0200, Kristian Damm Jensen wrote:
> Nis Jorgensen wrote: <snip>
>> SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
> Nej, nej, nej!
Jo, såmænd.
> Hvorfor sortere hele mellemresultatet (potentielt hele tabellen)
> frem for at lade optimizeren og det relevante index gøre arbejdet?
Fordi det er nødvendigt?
Den ovenstående og den nedenstående stump SQL giver ikke samme
resultat*.
> Som Kim Petersen skrev:
> SELECT min(ID) FROM table WHERE Tal >= 3
Dette giver nemlig:
mysql> SELECT min(ID) FROM tabel WHERE Tal >= 3;
+---------+
| min(ID) |
+---------+
| 2 |
+---------+
Hvor det første giver:
mysql> SELECT ID FROM tabel WHERE Tal >= 3 ORDER BY Tal LIMIT 1;
+------+
| ID |
+------+
| 4 |
+------+
Mvh.
Adam.
(*: Med mindre da at der gælder hvis et id er større end et andet, så
er det tilhørende tal også, og det gælder ihvertfald ikke for
eksemplet i den oprindelige artikel (f.ex. (2, 8) og (3, 5)).
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Kim Petersen (18-10-2001)
| Kommentar Fra : Kim Petersen |
Dato : 18-10-01 20:17 |
|
asjo@koldfront.dk (Adam Sjøgren) writes:
> On Thu, 18 Oct 2001 18:39:56 +0200, Kristian Damm Jensen wrote:
>
> > Nis Jorgensen wrote: <snip>
>
> >> SELECT ID FROM table WHERE Tal >= 3 ORDER BY Tal LIMIT 1
>
> > Nej, nej, nej!
>
> Jo, såmænd.
>
> > Hvorfor sortere hele mellemresultatet (potentielt hele tabellen)
> > frem for at lade optimizeren og det relevante index gøre arbejdet?
>
> Fordi det er nødvendigt?
>
> Den ovenstående og den nedenstående stump SQL giver ikke samme
> resultat*.
>
> > Som Kim Petersen skrev:
>
> > SELECT min(ID) FROM table WHERE Tal >= 3
>
> Dette giver nemlig:
>
> mysql> SELECT min(ID) FROM tabel WHERE Tal >= 3;
> +---------+
> | min(ID) |
> +---------+
> | 2 |
> +---------+
>
> Hvor det første giver:
>
> mysql> SELECT ID FROM tabel WHERE Tal >= 3 ORDER BY Tal LIMIT 1;
> +------+
> | ID |
> +------+
> | 4 |
> +------+
>
Det har du da såmen ret i.... Jeg læste åbenbart for hurtigt.
SELECT ID FROM table WHERE Tal=(SELECT min(Tal) FROM table WHERE Tal>=3);
Og i tilfælde af at MySQL ikke kan lave subselects.
SELECT min(Tal) INTO TEMPORARY tmp WHERE Tal>=3;
SELECT ID FROM table t,tmp p WHERE t.Tal=p.Tal;
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Adam Sjøgren (18-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 18-10-01 20:48 |
|
On 18 Oct 2001 21:16:59 +0200, Kim Petersen wrote:
> Og i tilfælde af at MySQL ikke kan lave subselects.
Det kan den vist ikke:
http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
> SELECT min(Tal) INTO TEMPORARY tmp WHERE Tal>=3;
> SELECT ID FROM table t,tmp p WHERE t.Tal=p.Tal;
Får man så ikke mere end en række ud hvis der er flere id'er der har
samme tal?
Men det er naturligvis bare et spørgsmål om at sætte en limit 1 på den
sidste select.
(Det kræver vist i øvrigt lidt mere gymnastik i MySQL (select into er
en Oracle SQL udvidelse, skriver de:
http://www.mysql.com/doc/M/i/Missing_SELECT_INTO_TABLE.html
http://www.mysql.com/doc/S/E/SELECT.html))
[Og der er selvfølgelig stadigvæk > / >= fejlen].
Mvh.
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Kim Petersen (18-10-2001)
| Kommentar Fra : Kim Petersen |
Dato : 18-10-01 21:30 |
|
asjo@koldfront.dk (Adam Sjøgren) writes:
> On 18 Oct 2001 21:16:59 +0200, Kim Petersen wrote:
>
> > Og i tilfælde af at MySQL ikke kan lave subselects.
>
> Det kan den vist ikke:
> http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
>
> > SELECT min(Tal) INTO TEMPORARY tmp WHERE Tal>=3;
> > SELECT ID FROM table t,tmp p WHERE t.Tal=p.Tal;
>
> Får man så ikke mere end en række ud hvis der er flere id'er der har
> samme tal?
>
> Men det er naturligvis bare et spørgsmål om at sætte en limit 1 på den
> sidste select.
Udgangspunktet var en tabel hvor dette ikke var tilfældet - og i til-
fældet hvor det er sandt - så bør du have et udgangspunkt for _hvilket_
ID du vil have - ikke? (så igen er LIMIT nok ikke det fede)
>
> (Det kræver vist i øvrigt lidt mere gymnastik i MySQL (select into er
> en Oracle SQL udvidelse, skriver de:
> http://www.mysql.com/doc/M/i/Missing_SELECT_INTO_TABLE.html
> http://www.mysql.com/doc/S/E/SELECT.html))
De har ikke ret - SQL92 standarden definerer "SELECT INTO", og PostgreSQL kan
også (om SQL92 accepterer TEMPORARY er så noget andet [har ikke checket]):
SQL92 BNF-> http://www.contrib.andrew.cmu.edu/%7Eshadow/sql/sql2bnf.aug92.txt
>
> [Og der er selvfølgelig stadigvæk > / >= fejlen].
Den gik jeg udfra vi alle havde argumenteret om tidligere
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Kim Petersen (18-10-2001)
| Kommentar Fra : Kim Petersen |
Dato : 18-10-01 21:36 |
|
asjo@koldfront.dk (Adam Sjøgren) writes:
> On 18 Oct 2001 21:16:59 +0200, Kim Petersen wrote:
>
> > Og i tilfælde af at MySQL ikke kan lave subselects.
>
> Det kan den vist ikke:
> http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
Den giver så tilgengæld et par noter til hvordan du kommer udenom...
SELECT ID FROM tabel WHERE Tal IN (SELECT min(Tal) FROM tabel WHERE Tal>=3);
burde virke.
MySQL's begrænsninger er iøvrigt een af grundene til at jeg ikke bruger den
til andet end trivialiteter.
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Adam Sjøgren (19-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 19-10-01 08:51 |
|
On 18 Oct 2001 22:36:27 +0200, Kim Petersen wrote:
>> Det kan den vist ikke:
>> http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
> Den giver så tilgengæld et par noter til hvordan du kommer udenom...
> SELECT ID FROM tabel WHERE Tal IN (SELECT min(Tal) FROM tabel WHERE
> Tal>=3);
> burde virke.
Øh, nej - der bruger du jo netop et sub-select
> MySQL's begrænsninger er iøvrigt een af grundene til at jeg ikke
> bruger den til andet end trivialiteter.
Webfnidder er som regel trivialiteter. Til gengæld siges det at den er
rimelig hurtig.
Mvh.
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Kim Petersen (19-10-2001)
| Kommentar Fra : Kim Petersen |
Dato : 19-10-01 09:40 |
|
asjo@koldfront.dk (Adam Sjøgren) writes:
> On 18 Oct 2001 22:36:27 +0200, Kim Petersen wrote:
>
> >> Det kan den vist ikke:
> >> http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
>
> > Den giver så tilgengæld et par noter til hvordan du kommer udenom...
>
> > SELECT ID FROM tabel WHERE Tal IN (SELECT min(Tal) FROM tabel WHERE
> > Tal>=3);
>
> > burde virke.
>
> Øh, nej - der bruger du jo netop et sub-select
Heh, ja men den dokumentation du gav - siger at denne er mulig. Hvor imod
den anden ikke var.
>
> > MySQL's begrænsninger er iøvrigt een af grundene til at jeg ikke
> > bruger den til andet end trivialiteter.
>
> Webfnidder er som regel trivialiteter. Til gengæld siges det at den er
> rimelig hurtig.
>
Kommer absolut an på hvad slag Webfnidder - en tabel => MySQL - flere
sammenkoblede tabeller => PostgreSQL, Oracle o.lign.
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Adam Sjøgren (19-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 19-10-01 08:55 |
|
On 18 Oct 2001 22:29:43 +0200, Kim Petersen wrote:
> Udgangspunktet var en tabel hvor dette ikke var tilfældet
Ja. Det var også en tabel med 5 indgange - hvad som helst smart dér er
ligegyldigt.
> - og i til- fældet hvor det er sandt - så bør du have et
> udgangspunkt for _hvilket_ ID du vil have - ikke?
Selvom udgangspunktet var ret uklart formuleret, så kunne man gætte
sig til noget om de andre ting, men ikke til noget om dette.
Det jeg tænkte var at er der forskel på om man _altid_ får højest et
element ud, eller om man med forskellige data i tabellen kan få flere.
Jeg ville i hvertfald blive forvirret første gang der kom mere end en
række ud (givet den oprindelige "opgaveformulering").
(Men jeg er heller ikke vant til at lege med databaser).
> (så igen er LIMIT nok ikke det fede)
Det kommer naturligvis an på hvad man vil opnå.
>> (Det kræver vist i øvrigt lidt mere gymnastik i MySQL (select into
>> er en Oracle SQL udvidelse, skriver de:
>> http://www.mysql.com/doc/M/i/Missing_SELECT_INTO_TABLE.html
>> http://www.mysql.com/doc/S/E/SELECT.html))
> De har ikke ret - SQL92 standarden definerer "SELECT INTO",
De kunne have prøvet at redde den ved at sige at SQL ikke nødvendigvis
er SQL92, men de nævner ikke forskellen på:
http://www.mysql.com/doc/D/i/Differences_from_ANSI.html
så det kan de ikke.
Sikke pinligt for dem!
Mvh.
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Adam Sjøgren (19-10-2001)
| Kommentar Fra : Adam Sjøgren |
Dato : 19-10-01 15:43 |
|
On 19 Oct 2001 10:40:13 +0200, Kim Petersen wrote:
>>>> Det kan den vist ikke:
>>>> http://www.mysql.com/doc/M/i/Missing_Sub-selects.html
>>> Den giver så tilgengæld et par noter til hvordan du kommer
>>> udenom...
>>> SELECT ID FROM tabel WHERE Tal IN (SELECT min(Tal) FROM tabel
>>> WHERE Tal>=3);
>>> burde virke.
>> Øh, nej - der bruger du jo netop et sub-select
> Heh, ja men den dokumentation du gav - siger at denne er mulig. Hvor
> imod den anden ikke var.
Nej (jeg prøvede naturligvis inden jeg postede mit svar). Der står:
"1.8.4.1 Sub-selects
MySQL currently only supports sub selects of the form INSERT
... SELECT ... and REPLACE ... SELECT .... You can however use the
function IN() in other contexts.
In many cases you can rewrite the query without a sub-select:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
This can be re-written as:
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;"
Det kunne være formuleret bedre, men der menes at det første - som
ikke understøttes - kan omskrives til det andet - der gør.
> Kommer absolut an på hvad slag Webfnidder - en tabel => MySQL -
> flere sammenkoblede tabeller => PostgreSQL, Oracle o.lign.
Alt for kortfattet generalisering => sjældent særligt nyttigt.
,
--
"Af de fire elementer har jeg Adam Sjøgren
altid holdt mest af luften." asjo@koldfront.dk
| |
Kristian Damm Jensen (22-10-2001)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 22-10-01 10:00 |
|
Adam Sjøgren wrote:
<snip>
> Nej (jeg prøvede naturligvis inden jeg postede mit svar). Der står:
>
> "1.8.4.1 Sub-selects
>
> MySQL currently only supports sub selects of the form INSERT
> ... SELECT ... and REPLACE ... SELECT .... You can however use the
> function IN() in other contexts.
>
> In many cases you can rewrite the query without a sub-select:
>
> SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
>
> This can be re-written as:
>
> SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;"
>
> Det kunne være formuleret bedre, men der menes at det første - som
> ikke understøttes - kan omskrives til det andet - der gør.
Hvilket oven i købet ikke er korrekt, da den sidste af de to kan give
anledning til dubletter, hvor den første ikke gør det. Og distinct
virker ikke, da den fjerner de dubletter, der kunne komme fra den
første.
<snip>
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts does.
| |
|
|