webForumDet fria alternativet

Är denna sql-sats korrekt?

23 svar · 576 visningar · startad av jme

jmeMedlem sedan maj 20012 237 inlägg
#1

Hej!

Jag har följande tabell:

mysql> select * from poioptions;
+----+---------+-----------+
| id | opt_key | opt_value |
+----+---------+-----------+
| 38 | url     | myurl     |
| 39 | email   | myemail   |
| 39 | phone   | myphone   |
+----+---------+-----------+
3 rows in set (0.00 sec)

Jag vill få ut alla rader där id=39 och opt_key=email och opt_key=phone

Fungerar följande sql-sats till detta?

SELECT * FROM poioptions AS p, poioptions AS p2 WHERE p.opt_key='email' AND p2.opt_key='phone';

Detta kommer att byggas in i en web-lösning. Givetvis kommer systemet att räkna antalet parametrar och därefter dynamiskt skapa poioptions p, poioptions p2... pn osv...

Först så hade jag enbart OR mellan:

.... FROM poioptions where opt_key='xxx' or opt_key='zzz' osv

Detta för att jag inte då kom ihåg att man bör kunna kringå detta mha aliaser (?)

@ndersMedlem sedan juni 200032 969 inlägg
#2
SELECT * FROM poioptions WHERE ID = 39 AND opt_key IN ('email', 'phone')

Jag förstår inte riktigt varför du krånglar till det?

jmeMedlem sedan maj 20012 237 inlägg
#3

Du, inte jag heller, ifall det går att göra så där. :)

Då var det löst. Tack!

jmeMedlem sedan maj 20012 237 inlägg
#4

Följdfråga:

kan jag kombinera ditt förslag med wildcards?

dvs


SELECT * FROM poioptions WHERE ID = 39 AND opt_key IN ('%email%', '%phone%')
@ndersMedlem sedan juni 200032 969 inlägg
#5

Nej, då måste du skriva om det till LIKE.

SELECT * FROM poioptions WHERE ID = 39 AND (opt_key LIKE '%email%' OR opt_key LIKE '%phone%')

Mvh

jmeMedlem sedan maj 20012 237 inlägg
#6

Då får jag väl göra såhär (som i mitt första förslag, förutom att jag kör med like och inte=):

SELECT * FROM poioptions AS p, poioptions AS p2 WHERE p.opt_key LIKE '%email%' AND p2.opt_key LIKE '%phone%';

*** STRUNTA I DETTA SVAR! ***

jmeMedlem sedan maj 20012 237 inlägg
#7

Då får jag väl göra såhär (som i mitt första förslag, förutom att jag kör med like och inte=):

SELECT * FROM poioptions AS p, poioptions AS p2 WHERE (p.id=39 AND p.opt_key LIKE '%email%') AND (p2.id=29 AND p2.opt_key LIKE '%phone%');
@ndersMedlem sedan juni 200032 969 inlägg
@ndersMedlem sedan juni 200032 969 inlägg
#9

Eller är det jag som missförstår vad du vill ha ut?
Vill du bara ha ut något om det finns både telefon och e-post på aktuellt ID, eller vill du ha ut telefon och/eller e-post?

jmeMedlem sedan maj 20012 237 inlägg
#10

Detta ska bli till en sökfunktion. Ju exaktare sökdata, desto mindre träffar. I nuvarande läget så skall jag bara ha ut data ifall både telefon och e-post finns för den valda id:n.

Jo, vill man ha EXAKTA data så kör man inte med LIKE.

@ndersMedlem sedan juni 200032 969 inlägg
#11

Ok, då förstår jag! Då är mina svar felaktiga, och du var på rätt spår från början. :)

Men, du får nog ställa upp det som en UNION eller sätta riktiga JOIN-villkor mellan "tabellerna".

mvh

jmeMedlem sedan maj 20012 237 inlägg
#12

Hur/vad menar du? :)

@ndersMedlem sedan juni 200032 969 inlägg
#13

Typ så här kanske:

SELECT * FROM poioptions AS P
INNER JOIN poioptions AS P2
ON P.ID = P2.ID
AND P.opt_key LIKE '%phone%'
AND P2.opt_key LIKE '%email%'
WHERE
P.ID = 39

Mvh

jmeMedlem sedan maj 20012 237 inlägg
#14

Saken är att det kan behövas:

FROM POIOptions as po, POIOptions as po2, POIOptions as po3 osv. Troligtvis högst 10 st.

Kan jag då använda INNER JOIN med fler än två aliaser?

Typ:


INNER JOIN poioptions AS P2
ON P.ID = P2.ID AND P.ID=P3.ID AND P.ID=P4.ID (osv)
@ndersMedlem sedan juni 200032 969 inlägg
#15

Japp.

Exempel (så länge vi inte pratar om Access):

SELECT * FROM poioptions AS P
INNER JOIN poioptions AS P2
ON P.ID = P2.ID
INNER JOIN poioptions AS P3
ON P.ID = P3.ID
INNER JOIN poioptions AS P4
ON P.ID = P4.ID

Men se till att du specificerar i SELECT-listan vilka fält du vill hämta från respektive "tabell", och sätt olika alias på dem.

Mvh

jmeMedlem sedan maj 20012 237 inlägg
#16

kan du ge ännu ett exempel då det finns fler än två aliaser? :)

@ndersMedlem sedan juni 200032 969 inlägg
#17

^^

Höll på att redigera in det när du skrev ditt inlägg. ;)

Mvh

jmeMedlem sedan maj 20012 237 inlägg
#18

Vi kör med MySql 4.1 just nu.

Ska se hur jag gör det. Egentligen håller jag på med att skapa en hql-fråga till Hibernate 2.

Den egentliga sql-satsen kommer inte att se exakt ut så här.

Tusen tack för din hjälp!

@ndersMedlem sedan juni 200032 969 inlägg
#19

Vad är Hibernate 2? :)

jmeMedlem sedan maj 20012 237 inlägg
#20

Plockat ur https://www.hibernate.org

Hibernate is a powerful, ultra-high performance object/relational persistence and query service for Java. Hibernate lets you develop persistent classes following common Java idiom - including association, inheritance, polymorphism, composition, and the Java collections framework.

Vi kör med det. Rätt så jobbigt att lära sig att konffa (xml), men ganska roligt att arbeta med. Om man kör med Hibernate 3 och Java 1.5 så kan man skapa alla mappningarna genom annotations och slippa konffa xml.

Kör man med v. 2 kan man alltid använda XDoclet, vilket jag inte gör. Orkar inte lära mig femtioelva grejer på så lite ntid. ;)

Exempel:

FROM POI as p WHERE p.id=29; <--- p.id = p.getId() och POI är en Java-klass.

Man kan göra rätt så avancerade grejer utan att egenteligen skapa allt för mycket sql-satser. Dessutom så kör man med hql som är en objektorienterad sql-språk för just Hibernate.

Hibernate verkar vara en av de största och bästa OR/M-verktygen just nu, iaf enligt många. Har själv inte använt JDO, iBatis, Castor eller liknande.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)