Avatar billede RasmusTheR Seniormester
15. marts 2017 - 19:37 Der er 10 kommentarer og
3 løsninger

Databese udtræk som array

Jeg har en database med brugere, og vil gerne finde længden af det længste navn.

Er der en let måde at gøre det?

Jeg har følgende, men kan forstå, at jeg ikke får udtrækket som en array, som jeg kan gå igennem og finde længden på det længste navn

$sqli = "SELECT navn FROM bruger";
$result = $conn->query($sqli);
Avatar billede arne_v Ekspert
15. marts 2017 - 19:51 #2
SELECT MAX(LENGTH(navn)) FROM bruger

og ikke noget array??
Avatar billede acore Ekspert
15. marts 2017 - 19:54 #3
Du kan gøre det direkte i sql:

$sqli = "SELECT navn, MAX( LENGTH(navn) ) FROM  bruger";

$result = $conn->query($sqli);
$row = $result->fetch_assoc();
echo $row['navn'];
Avatar billede RasmusTheR Seniormester
15. marts 2017 - 20:41 #4
Så lykkes det :-)

Mange tak alle sammen
Avatar billede RasmusTheR Seniormester
18. marts 2017 - 16:33 #5
Hej, måske I kan hjælpe med en udfordring i forlængelse af dette spørgsmål?

Jeg fik skruet følgende SQL sammen ud fra jeres svar. Max længden virker perfekt, men havd nu hvis jeg også vil have det længste navn ud, og ikke kun hvor langt det er?
Ved følgende sætning får jeg det første navn i databasen og ikke det som jeg finder værdien på:

SELECT navn, MAX(LENGTH(navn)) as LongestName FROM bruger
Avatar billede olsensweb.dk Ekspert
18. marts 2017 - 17:50 #6
#5
en måske lidt klodset løsning, med en subselect

SELECT * FROM bruger WHERE LENGTH(navn) = (select MAX(LENGTH(navn)) FROM bruger)

eller hvis du skal have længden med
SELECT *, MAX(LENGTH(navn)) as LongestName FROM bruger WHERE LENGTH(navn) = (select MAX(LENGTH(navn)) FROM bruger)
Avatar billede olsensweb.dk Ekspert
18. marts 2017 - 17:53 #7
der er ikke grund til MAX 2 gange
SELECT *, LENGTH(navn) as LongestName FROM bruger WHERE LENGTH(navn) = (select MAX(LENGTH(navn)) FROM bruger)
Avatar billede acore Ekspert
19. marts 2017 - 15:56 #8
SELECT navn, MAX( LENGTH(navn) ) FROM bruger

skal give din én record med navn og længde på det længste navn. Så ingen grund til at komplicerere det yderligere. I øvrigt det forslag, der allerede står i #3.
Avatar billede arne_v Ekspert
19. marts 2017 - 16:14 #9
Men bemaerk at der er forskel paa den simple og where subselect i de tilfaelde hvor der er flere af samme laengde.
Avatar billede olsensweb.dk Ekspert
19. marts 2017 - 16:38 #10
#8
det var også min første tanke, så jeg afprøvede den i phpmyadmin :), da spørgeren lavede #5

test tabel

CREATE TABLE `bruger` (
  `id` int(11) NOT NULL,
  `navn` varchar(50) COLLATE utf8_danish_ci NOT NULL,
  `dob` datetime NOT NULL,
  `land_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `bruger` (`id`, `navn`, `dob`, `land_id`) VALUES
(1, 'allan simonsen', '1999-12-31 00:00:00', 1),
(2, 'jan mølby', '2000-02-28 00:00:00', 1),
(3, 'jan mølby er et langt navn', '2000-02-28 00:00:00', 1),
(4, 'jan mølby senior', '1979-02-28 00:00:00', 1);


ALTER TABLE `bruger`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `bruger`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;



SELECT navn, MAX( LENGTH(navn) ) FROM bruger


output
navn, MAX( LENGTH(navn) )
allan simonsen, 27

dette passer ikke


SELECT navn, LENGTH(navn) as LongestName FROM bruger WHERE LENGTH(navn) = (select MAX(LENGTH(navn)) FROM bruger)

output
navn, LongestName
jan mølby er et langt navn, 27

det ser mere rigtigt ud

kunne det være mellemrum der driller, men nej, har prøvet at erstatte dem med underscore
Avatar billede acore Ekspert
19. marts 2017 - 17:36 #11
#10 - du har en pointe der.

SELECT navn, MAX(LENGTH(navn)) AS len FROM bruger GROUP BY navn ORDER BY len DESC LIMIT 1

virker i alle fald.
Avatar billede arne_v Ekspert
20. marts 2017 - 01:33 #12
Hele konstruktionen er en bastard.

I standard SQL skal alle selected vaerdier som ikke er en aggregeret funktion angives i en GROUP BY naar man bruger aggregerede funktioner.

Note: fra SQL99 tillades vaerdier der er fuldt afhaengige af noget i GROUP BY (det maa reelt betyde hvis primaer noeglen er i GROUP BY).

MySQL tillader felter som ikke er i GROUP BY.

Note: til og med 5.7.4 - efter det f'ger de standarden.

Og tager saa en "tilfaeldig" vaerdi for det felt.

Her troede jeg at den ville tage vaerdien fra en tilfaeldig raekke blandt de raekker hvor laengden er max.

Men tilsyneladende tager den vaerdien fra en tilfaeldig raekke  blandt alle raekker der er undersoegt for max laengde.

Dokumentationen er ikke saa tydelig:

MySQL extends the standard SQL use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. This means that the preceding query is legal in MySQL. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.

Men logikken maa jo vaere at ingen GROUP BY putter alt i en gruppe.
Avatar billede acore Ekspert
20. marts 2017 - 07:37 #13
Tak for det - havde selv kigget i dokumentationen, men uden held, og jeg savnede en god forklaring på det tilsyneladende "tilfældige" navn.
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

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