Gå til innhold

[Løst] MYSQL Hvordan SELECT-er jeg en kolone med 3 forskjellige verdier (språk) ?


Anbefalte innlegg

post-81752-1274211605,1305_thumb.jpg

 

Følgende kode vil liste opp 2 koloner men jeg vil ha 3 !

SELECT      e.ord , s.ord

FROM        ordliste AS s 
INNER JOIN  ordliste AS e
ON          e.ord_nummer = s.ord_number
AND         e.språk = "Norsk"
AND         s.språk = "Engelsk" 
AND         e.kapitel="1"
AND         s.kapitel="1"

 

 

noen som har greie på det?

 

edit:

Lagt til eksempel bilde.

Endret av peace2
Lenke til kommentar
Videoannonse
Annonse

Litt usikker på hva du prøver å gjøre, men det jeg synes det høres ut som er at du vil egentlig kjøre vanlige spørringer, men vil ha resultatene presentert i kolonner istedenfor rader.

 

Du ønsker feks å gjøre en spørring på ordet "Hei", får det ut på 3 språk hvor første rad inneholder navnet på språkene og neste rad inneholder oversettelsene?

 

Det kalles vel å transponere resultatet tror jeg. Måten å gjøre det på tror jeg er vel i ettertid i skriptspråket ditt vil jeg tro, feks at du slenger aller reaultatene inn i en array og bruker den til å lage sluttabellen din.

Lenke til kommentar

Litt usikker på hva du prøver å gjøre, men det jeg synes det høres ut som er at du vil egentlig kjøre vanlige spørringer, men vil ha resultatene presentert i kolonner istedenfor rader.

 

Du ønsker feks å gjøre en spørring på ordet "Hei", får det ut på 3 språk hvor første rad inneholder navnet på språkene og neste rad inneholder oversettelsene?

 

Det kalles vel å transponere resultatet tror jeg. Måten å gjøre det på tror jeg er vel i ettertid i skriptspråket ditt vil jeg tro, feks at du slenger aller reaultatene inn i en array og bruker den til å lage sluttabellen din.

Hei igjen! takk for sjapp respons.

Nei spørring på et ord er enkelt =) bare å spørre 3 ganger så får man til..

bruker html+php og mysql :)

 

Jeg vil altså liste opp alle ordene ( la oss si 30 ord totalt så ikke vi trenger å ta med neste og forige knappene)

 

Har lagt til et eksempel bilde opp for å gjøre det lettere å se

Lenke til kommentar

Det jeg tenker da er at du gjør noe slikt som

 

SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;

 

Så får du dette resultatet ut og bruker en while til å løpe igjennom det og skrive det til tabellen.

 

Hver gang du får at forrige ord_nummer er ulikt det neste lager du en ny rad.

Endret av Ekko
Lenke til kommentar

Det jeg tenker da er at du gjør noe slikt som

 

SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;

 

Så får du dette resultatet ut og bruker en while til å løpe igjennom det og skrive det til tabellen.

 

Hver gang du får at forrige ord_nummer er ulikt det neste lager du en ny rad.

 

Problemet med det er at det ikke går ann å ha i tabell.

 

La oss ta et eksempel:

<?php
$opplistingsvariabel= "<table><tbody><tr><td>Norsk</td> <td>Engelsk</td> <td>fransk</td></tr>"; //her startes tabellen
$result = mysql_query("SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;");
while($row = mysql_fetch_array($result))
 {
 $ord = $row['ord'];
$opplistingsvariabel.="<tr> <td>norskvariabel</td><td>engelskvariabel</td><td>spanskvariabel</td> </tr>"; //her loopes tabellen gjennom ordene som fins i db. problemet er her!  ordene vil da vises på et språk! da er det umulig å få laget variabler av det... 
 }
?>
$opplistingsvariabel.="</tbody></table>"; //tabellen avsluttes her

print $opplistingsvariabel; // tabllen skrives her

 

man får ikke 3 språk ut av det. derfor har jeg lagt til en spørringskode i første post som da klarer å liste opp 2 koloner. eneste problemet som gjenstår da er muligheten til å utvide den spørringen til å liste opp alle 3 kolonene!

Endret av peace2
Lenke til kommentar

Dette blirl itt kvasikode, ikke ta all syntaksen for god fisk.

Legg merke til at denne løsninegn forutsetter at alle språkene har ordet for at det skal bli pent og riktig.

Du vil og få de norske ordene uder franske, franske under engelske og engelske under franske slik det er nå, men det kan du nok finne på en løsnig for.

 

<?php

$opplistingsvariabel= "<table><tbody><tr><td>Norsk</td> <td>Engelsk</td> <td>fransk</td></tr>"; //her startes tabellen
$result = mysql_query("SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;");
while($row = mysql_fetch_array($result)){
 $ord = $row['ord'];
 $ordnummer = $row['ordnummer'];

 if(ordnummer==$forrigeordnummer){
   $opplistingsvariabel.="<td>$ord</td>";
 }else{
   $opplistingsvariabel.="</tr><tr><td>$ord</td>";
   $forrigeordnummer=$ordnummer;
 }
}
?>
$opplistingsvariabel.="</tr></tbody></table>"; //tabellen avsluttes her

print $opplistingsvariabel; // tabllen skrives her

 

 

Fikk ikke tid til å lese igjennom alt her, emn du skjønenr kanskje poenget.

Lenke til kommentar

Dette blirl itt kvasikode, ikke ta all syntaksen for god fisk.

Legg merke til at denne løsninegn forutsetter at alle språkene har ordet for at det skal bli pent og riktig.

Du vil og få de norske ordene uder franske, franske under engelske og engelske under franske slik det er nå, men det kan du nok finne på en løsnig for.

 

<?php

$opplistingsvariabel= "<table><tbody><tr><td>Norsk</td> <td>Engelsk</td> <td>fransk</td></tr>"; //her startes tabellen
$result = mysql_query("SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;");
while($row = mysql_fetch_array($result)){
 $ord = $row['ord'];
 $ordnummer = $row['ordnummer'];

 if(ordnummer==$forrigeordnummer){
   $opplistingsvariabel.="<td>$ord</td>";
 }else{
   $opplistingsvariabel.="</tr><tr><td>$ord</td>";
   $forrigeordnummer=$ordnummer;
 }
}
?>
$opplistingsvariabel.="</tr></tbody></table>"; //tabellen avsluttes her

print $opplistingsvariabel; // tabllen skrives her

 

 

Fikk ikke tid til å lese igjennom alt her, emn du skjønenr kanskje poenget.

  • Liker 1
Lenke til kommentar

Dette blirl itt kvasikode, ikke ta all syntaksen for god fisk.

Legg merke til at denne løsninegn forutsetter at alle språkene har ordet for at det skal bli pent og riktig.

Du vil og få de norske ordene uder franske, franske under engelske og engelske under franske slik det er nå, men det kan du nok finne på en løsnig for.

 

<?php

$opplistingsvariabel= "<table><tbody><tr><td>Norsk</td> <td>Engelsk</td> <td>fransk</td></tr>"; //her startes tabellen
$result = mysql_query("SELECT ord_nummer, ord, språk FROM tabell ORDER BY ord_nummer, språk;");
while($row = mysql_fetch_array($result)){
 $ord = $row['ord'];
 $ordnummer = $row['ordnummer'];

 if(ordnummer==$forrigeordnummer){
   $opplistingsvariabel.="<td>$ord</td>";
 }else{
   $opplistingsvariabel.="</tr><tr><td>$ord</td>";
   $forrigeordnummer=$ordnummer;
 }
}
?>
$opplistingsvariabel.="</tr></tbody></table>"; //tabellen avsluttes her

print $opplistingsvariabel; // tabllen skrives her

 

 

Fikk ikke tid til å lese igjennom alt her, emn du skjønenr kanskje poenget.

Det løste ikke problemt enda...

La oss heller fikse på dette (to koloners listing), utvide det slik at det blir mulig å få med 3 koloner:

 

SELECT      e.ord , s.ord

FROM        ordliste AS s 
INNER JOIN  ordliste AS e
ON          e.ord_nummer = s.ord_number
AND         e.språk = "Norsk"
AND         s.språk = "Engelsk" 
AND         e.kapitel="1"
AND         s.kapitel="1"

Lenke til kommentar
  • 2 uker senere...

SELECT e.ord, s.ord, n.ord
FROM test AS s
INNER JOIN test AS e ON e.ordnr = s.ordnr
INNER JOIN test AS n ON e.ordnr = n.ordnr
AND e.language = 'Norsk'
AND s.language = 'Engelsk'
AND n.language = 'Spansk'
AND e.kapitel =1
AND s.kapitel =1
AND n.kapitel =1

 

Alternativt er som Ekko er inn på å løse dette i php

echo '<table>';
echo '<tr><th>Språk1</th><th>Språk2</th><th>Språk3</th></tr>';

$result = mysql_query("SELECT ord_nummer, ord, språk FROM ordliste ORDER BY ordnr, språk");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ord_nummer']!=$ordnr)
 {
   if ($ordnr>0) echo '</tr>'; // ikke første rad

   $ordnr=$row['ord_nummer'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';


}
echo '</table>';

<table>
<tr><th>Språk1</th><th>Språk2</th><th>Språk3</th></tr>
<tr><td>Hi</td><td>Hei</td><td>Hello</td></tr>
<tr><td>Test</td><td>Test</td><td>Test</td></tr>
</table>

Endret av Crowly
  • Liker 1
Lenke til kommentar

SELECT e.ord, s.ord, n.ord
FROM test AS s
INNER JOIN test AS e ON e.ordnr = s.ordnr
INNER JOIN test AS n ON e.ordnr = n.ordnr
AND e.language = 'Norsk'
AND s.language = 'Engelsk'
AND n.language = 'Spansk'
AND e.kapitel =1
AND s.kapitel =1
AND n.kapitel =1

 

Alternativt er som Ekko er inn på å løse dette i php

echo '<table>';
echo '<tr><th>Språk1</th><th>Språk2</th><th>Språk3</th></tr>';

$result = mysql_query("SELECT ord_nummer, ord, språk FROM ordliste ORDER BY ordnr, språk");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ord_nummer']!=$ordnr)
 {
   if ($ordnr>0) echo '</tr>'; // ikke første rad

   $ordnr=$row['ord_nummer'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';


}
echo '</table>';

<table>
<tr><th>Språk1</th><th>Språk2</th><th>Språk3</th></tr>
<tr><td>Hi</td><td>Hei</td><td>Hello</td></tr>
<tr><td>Test</td><td>Test</td><td>Test</td></tr>
</table>

 

SELECT e.ord, s.ord, n.ord
FROM test AS s
INNER JOIN test AS e ON e.ordnr = s.ordnr
INNER JOIN test AS n ON e.ordnr = n.ordnr
AND e.language = 'Norsk'
AND s.language = 'Engelsk'
AND n.language = 'Spansk'
AND e.kapitel =1
AND s.kapitel =1
AND n.kapitel =1

 

 

Derjah! endlig fungerer 3-koloners løsningen :D Tusen takk!! øh jeg fikk aldri til før nå. det som forvirret meg mest var de bokstavene "e" "s" "n" , er det spesielle bokstaver? eller valgfrie?

Hva kalles evt. den type spørring? kjekt om du hadde en link så jeg fikk lært mer om slike spørringer =)

 

 

 

echo '<table>';
echo '<tr><th>Språk1</th><th>Språk2</th><th>Språ
k3</th></tr>';

$result = mysql_query("SELECT ord_nummer, ord, språk FROM ordliste ORDER BY ordnr, språk");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ord_nummer']!=$ordnr)
 {
   if ($ordnr>0) echo '</tr>'; // ikke første rad

   $ordnr=$row['ord_nummer'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';


}
echo '</table>';

 

Viftene blåste noe voldsomt der ( lokal server ) fikk deretter:

Fatal error: Maximum execution time of 60 seconds

 

Sikkert en liten feil et sted?

Lenke til kommentar

 

 

 

Derjah! endlig fungerer 3-koloners løsningen :D Tusen takk!! øh jeg fikk aldri til før nå. det som forvirret meg mest var de bokstavene "e" "s" "n" , er det spesielle bokstaver? eller valgfrie?

Hva kalles evt. den type spørring? kjekt om du hadde en link så jeg fikk lært mer om slike spørringer =)

 

 

Her brukes e, s og n som alias. Det er dette som gjøres i "test AS n" osv. Bokstavene er ikke spesielle, man kunne like godt skrevet "test AS norsk" og deretter brukt "norsk" alle stedene "n" er brukt. Det blir bare enklere og mer oversiktlig på denne måten.

 

 

Viftene blåste noe voldsomt der ( lokal server ) fikk deretter:

Fatal error: Maximum execution time of 60 seconds

 

Sikkert en liten feil et sted?

 

Stor database du har, hva var den nøyaktige spørringen du gjorde?

Var det en databasemelding eller fra webserveren?

 

Prøv å fjerne litt og litt av koden din for å se hvor problemet ligger.

  • Liker 1
Lenke til kommentar

Viftene blåste noe voldsomt der ( lokal server ) fikk deretter:

Fatal error: Maximum execution time of 60 seconds

 

Sikkert en liten feil et sted?

Skriptet bruker mer enn 60 sekunder på å fullføre, og blir derfor stoppet når det når maks kjøretid. Dette kan være fordi det er er veldig mange rader eller andre ting som gjør at det tar lang tid å fullføre. Du kan prøve å legge til

set_time_limit(150);

i toppen av skriptet, 150 er antall sekunder skriptet for lov til å kjøre, sett det til den tiden du ønsker, eller 0 for ingen grense.

 

Er ikke sikkert at dette er en effektiv måte å gjøre dette på. Er nok litt mer proof of concept. Det samme gjelder sql'en hvor samme tabell er koblet sammen tre ganger. Sikkert en del mer erfarne/kunnskapsrike brukere enn meg som evt. kan utbedre dette.

  • Liker 1
Lenke til kommentar

Laga en test tabell:

 

PHP koden:

<?php
echo '<table>';
echo '<tr><th>language1</th><th>language2</th><th>language3</th></tr>';

$result = mysql_query("SELECT ordnr, ord, language FROM ordliste ORDER BY ordnr, language");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ordnr']!=$ordnr)
 {
   if ($ordnr>0) echo '</tr>'; // ikke første rad

   $ordnr=$row['ordnr'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';


}
echo '</table>';

 ?>

 

bilde av phpmyadmin view (ordliste tabellen):

post-81752-1275519834,8737_thumb.jpg

 

 

Feilmeldingen (web):

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource

 

Noen som ser feilen?

Endret av peace2
Lenke til kommentar

Du kobler ikke til databasen i det skriptet, hele mitt test skript

 

<?php
echo '<table>';
echo '<tr><th>Språk1</th><th>Språk2</th><th>Språk3</th></tr>'."\n";

$conn=connect();

$result = mysql_query("SELECT ordnr, ord, language FROM test ORDER BY ordnr, language;");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ordnr']!=$ordnr)
 {
   if ($ordnr>0) echo "</tr>\n"; // ikke første rad

   $ordnr=$row['ordnr'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';
}
echo '</tr></table>';

function connect() 
{ 
  $host="127.0.0.1";
  $user="brukernavn";
  $pwd="*****";
  $db="test";

  if (!($link=@mysql_connect($host,$user,$pwd))) 
  { 
     echo "<p>Finner ikke databasen.</p>";
     exit(); 
  }
  if (!@mysql_select_db($db,$link)) 
  { 
     echo "<p>Kan ikke koble til databasen.</p>";
     exit(); 
  }
  return $link; 
}

 mysql_free_result($result);
 mysql_close($conn);
?>

 

 

(Ikke nødvendig å legge tilkoblingen i en egen funksjon, men jeg sakset den inn fra mine normale rutiner, derfor ble det slikt...)

Endret av Crowly
  • Liker 1
Lenke til kommentar

DerJA! :yes: Jeg hadde egentlig ferdig mal for å koble opp mot DB, jeg hadde bare glemt å bytte databasenavn til "test".

 

Jeg bruker 2 test filer

test.php -> inneholder websidenstema,kobling mot database , design osv.

test2.php -> innholder kun test data. ( inkluderes i test.php)

Lenke til kommentar

Dukka opp noe morsomt nu. Nå listes alle tilgjenglige språk!

post-81752-1276129073,3115_thumb.jpg

Sku gjerne begrenset anntall språk til 3!

 

Siste versjon av php kode:

<?php
mysql_select_db("test", $con);


echo '<table border="1">';
echo '<tr><td>Engelsk</td><td>Fransk</td><td>Norsk</td></tr>';

$result = mysql_query("SELECT ordnr, ord, language FROM ordliste ORDER BY ordnr, language");

$ordnr=-1;
while ($row=mysql_fetch_assoc($result))
{
 if ($row['ordnr']!=$ordnr)
 {
   if ($ordnr>0) echo '</tr>'; // ikke første rad

   $ordnr=$row['ordnr'];

   echo '<tr>'; // ny rad
 }

 echo '<td>'.$row['ord'].'</td>';


}
echo '</table>';

 ?>

Tabell: ordliste

post-81752-1276128726,7079_thumb.jpg

 

 

SQl export data:

-- phpMyAdmin SQL Dump
-- version 3.1.1
-- http://www.phpmyadmin.net
--
-- Vert: localhost
-- Generert den: 10. Jun, 2010 02:13 AM
-- Tjenerversjon: 5.1.30
-- PHP-Versjon: 5.2.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Tabellstruktur for tabell `ordliste`
--

CREATE TABLE IF NOT EXISTS `ordliste` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ordnr` text NOT NULL,
 `ord` text NOT NULL,
 `language` text NOT NULL,
 `kapitel` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Dataark for tabell `ordliste`
--

INSERT INTO `ordliste` (`id`, `ordnr`, `ord`, `language`, `kapitel`) VALUES
(1, '1', 'norsk1', 'Norsk', '1'),
(2, '1', 'engelsk2', 'Engelsk', '1'),
(3, '1', 'Fransk2', 'Fransk', '1'),
(4, '2', 'norsk2', 'Norsk', '1'),
(5, '2', 'engelsk1', 'Engelsk', '1'),
(6, '2', 'Fransk1', 'Fransk', '1'),
(7, '1', 'spansk', 'Spansk', '1'),
(8, '2', 'spansk2', 'Spansk', '1');

Endret av peace2
Lenke til kommentar

Sku gjerne begrenset anntall språk til 3!

Du har fire språk i tabellen, skal du kun trekke ut tre så må du enten begrense dette i sql med WHERE, eller legge til noe i php som hopper over rader med det fjerde språket. Det beste er nok å håndtere dette i sql.

 

// oppdatert sql med WHERE
$sql="SELECT ordnr, ord, language 
     FROM ordliste 
     WHERE language IN ('Engelsk','Fransk','Norsk')
     ORDER BY ordnr, language";

$result = mysql_query($sql);

 

Kan gjøre sql'en litt mer "dynamisk", noe ala dette

$lang='';

if (isset($_POST['engelsk'])) // bør lage noe bedre sjekk, kun for å illustrere
 $lang="'Engelsk'";

if (isset($_POST['fransk'])) 
{
 if (empty($lang)) $lang="'Fransk'";
 else $lang.=",'Fransk'";
}

// repeter for hvert språk, finnes sikkert mer elegante metoder

$sql=sprintf("SELECT ordnr, ord, language 
             FROM ordliste 
             WHERE language IN (%s)
             ORDER BY ordnr, language",
             $lang);

$result = mysql_query($sql);

Endret av Crowly
  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...