Gå til innhold

Trøbbel med MySQL spørring...[LØST]


Anbefalte innlegg

Hei!

 

Jeg er en fersking når det gjeler php og MySQL. Har en ting jeg gjerne vil ta opp med dere som er mer dreven på dette. Jeg har en spørring opp mot databasen hvor jeg henter ut bloggen min.

 

Den ser ut som følgende:

 

$sql = "SELECT * FROM blogg
          WHERE dato_publisert <= now()
          AND ( dato_utgaar >= now() OR dato_utgaar = '0000-00-00' )
          ORDER BY dato_publisert DESC, bloggid DESC";

 

Jeg vil gjerne konvertere dato formatet som er lagret i "dato_publisert". Det gjør jeg med å bruke denne spørringen:

 

$sql = "SELECT DATE_FORMAT( dato_publisert, '%d.%M %y' ) as dato_publisert    FROM blogg";

 

Er det mulig å kombinere disse to slik at jeg kun bruker en spørring?

 

Kim

Endret av kimthoma
Lenke til kommentar
Videoannonse
Annonse

Dette bør vel fungere:

SELECT DATE_FORMAT(dato_publisert, '%d %M %y') as dato_formatert FROM blogg WHERE dato_publisert <= now() AND ( dato_utgaar >= now() OR dato_utgaar = '0000-00-00' ) 
   ORDER BY dato_publisert DESC, bloggid DESC

Du får da tak i den formaterte datoen, ved å spørre etter feltet "dato_formatert"

Endret av kakkle
Lenke til kommentar

Jøss så raskt svart. Jeg skal teste med engang og komme med tilbakemelding.

 

Takk på forhånd... :)

 

EDIT: Bør ikke jeg sortere etter dato_formatert? :blush:

 

EDIT "Tilbakemelding": Det fungerte delvis. Problemet er at resten ikke dukker opp av bloggen. Det eneste som blir skrevet ut er datoene som forsåvidt er riktige. Men hva er det som tukler med de andre radene da?

 

Kim

Endret av kimthoma
Lenke til kommentar

Med den spørringen henter du kun ut "dato_publisert". Du må selv spesifisere hvilke andre rader du vil hente.

 

Eksempel:

SELECT DATE_FORMAT(dato_publisert, '%d %M %y') as dato_formatert, rad1, rad2, rad3
FROM blogg WHERE dato_publisert <= now() AND ( dato_utgaar >= now() OR dato_utgaar = '0000-00-00' )
ORDER BY dato_publisert DESC, bloggid DESC

rad1, rad2 og rad3 må endres til de andre du vil hente.

Lenke til kommentar

AHA. Tusen takk. Nå lærte jeg masse faktisk... :blush: Takker for hjelpen. Da er det bare å fortsette med det jeg holdt på med...

 

EDIT "Poster løsningen også i klartekst(koder)":

 

$sql = "SELECT DATE_FORMAT(dato_publisert, '%d.%M %y') as dato_formatert ,bloggid, tittel, ingress, bloggnyhet, url_info, nytt_vindu, 																																 		bildenavn, dato_lagtinn, dato_utgaar
			FROM blogg WHERE dato_publisert <= now() AND ( dato_utgaar >= now() OR dato_utgaar = '0000-00-00' ) 
						ORDER BY dato_formatert DESC, bloggid DESC";

Kim

Endret av kimthoma
Lenke til kommentar
$sql = "SELECT * FROM blogg

          WHERE dato_publisert <= now()

          AND ( dato_utgaar >= now() OR dato_utgaar = '0000-00-00' )

          ORDER BY dato_publisert DESC, bloggid DESC";

Bare ett lite tips om bruk av SELECT * FROM fra ett annet forum

 

If you use "select * from" you are automatically using 2 queries. One for it to go find the names of all the columns and another to actually run the query in the form "select col1, col2, col3,... coln". Even if it involves you writing out every single column name, do it. It may take you a while to do, but you only need to do it once. Your MySQL server may need to do it many many times.

 

Dette var i svar til denne problemstillingen som også kan være litt nyttig i denne sammenhengen

I was hearing horror stories about people whose BlueHost accounts were suspended for 'CPU Overuse'. I contacted BH (because I was considering moving there) about this and they said the biggest killer of CPU was "SELECT * FROM".

 

Løsningen har jo endret bruken av SELECT * i dette tilfellet, men hvis man skulle få lyst til å bruke det en annen gang, så kan det være greit å vurdere en ekstra gang om det virkelig er nødvendig ;)

Endret av crowly
Lenke til kommentar

Nice to know. Det var jeg ikke klar over. Men skal tenke på det til nestegang nå sitter jeg og sliter med å kovertere over til "norsk". Ser at det er en MySQL "funksjon" for dette som heter LOCALTIME. Vet ikke om jeg er på riktig spor. Men jeg har iallefall ikke fått det til å fungere ennå. Kanskje jeg må kaste inn håndkleet etterhvert på dette også. :blush:

 

Takker iallefall for alle svarene hittil. Jeg har iallefall lært noe idag. :innocent:

 

Kim

Lenke til kommentar

Ett lite tillegg til posten min over, dette er ett svar til select * problematikken

... but that is just rubbish. Regardless of whether you select * or by column name, the db engine is going to have to first read the table definition to determine the order, data type and hence size of each column to determine its offset within a row. If you have variable length columns then these will have to be read individually to calculate the offset for the next column. You will only see real gains in efficiency if you are selecting just a few columns from the front of the record. If you want all columns then naming them will save nothing.

 

Mr Hinman, the main reason your host sez that is because they are used to dealing with amateurs who have not normalised their data properly so they have needlessly wide tables and who use select * when they only need one or two columns. Such users are also likely to write queries within loops instead of learning how to use joins and where clauses.

Siden jeg kun har holdt på med php i ca ett år, så er jeg nødt til å stole på hva andre brukere sider når jeg ikke vet selv :whistle:

Men bunnlinja blir uannsett at bruk kun SELECT * når du trenger alle feltene i tabellen, hvis du ikke trenger alle så navngi dem med SELECT felt1, felt2, felt3, ... , feltN FROM :thumbup:

Lenke til kommentar

Men fikk ikke spørringen min til å fungere med:

SELECT DATE_FORMAT(dato_publisert, '%d.%M %y') as dato_formatert * FROM

 

Jeg er og helt nybegynner innenfor dette feltet og hadde nok "trodd" på det som ble sagt der siden jeg ikke har noen form for bakgrunn til å uttale meg om slikt. Men med å navngi alle radene så gikk det fint.

 

Kim

Lenke til kommentar
Jeg mener fortsatt at det å bruke SELECT * FROM er dårlig kodeskikk.

Er ikke for ingenting at alle større prosjekter navngir alle radene selv om de skal hente alle.

8903128[/snapback]

Klart, men når han faktisk skal bruke alle kolonner ser eg ikkje det heilt store problemet. Det var uansett bare et kodeeksempel som var forenkla så mykje som mulig, og å hive på kolonnenavn er 10 sekunder :)

Lenke til kommentar
Men fikk ikke spørringen min til å fungere med:
SELECT DATE_FORMAT(dato_publisert, '%d.%M %y') as dato_formatert * FROM

 

Jeg er og helt nybegynner innenfor dette feltet og hadde nok "trodd" på det som ble sagt der siden jeg ikke har noen form for bakgrunn til å uttale meg om slikt. Men med å navngi alle radene så gikk det fint.

 

Kim

8902934[/snapback]

 

du få fjerne * mellom dato_formatert og FROM.

Lenke til kommentar

Trodde det var "*" betydde at han skal hente ut "alt" :blush: Hva sier den da egentlig. Trodde jeg hadde lært noe her nå hehehe...

 

EDIT: TESTET nå og det fungerte ikke. Får da bare frem datoene. Ingen nyhet.

 

Kim

Endret av kimthoma
Lenke til kommentar

* betyr hent alt, men så vidt jeg vent kan du ikke blande den sammen med andre felt, du må fjerne stjerna og spesifisere alle de andre feltene du ønsker f.eks

SELECT DATE_FORMAT(dato_publisert, '%d.%M %y') dato_formatert, felt1, felt2, felt3, felt4 FROM

 

SELECT * FROM ....

vil velge alle felt uten formatering osv, men når du trenger å gjøre noe "ekstra" med feltene som f.eks distinct, max, date_format osv så må du gjøre som i det første sql eksemplet.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...