Archief - SQL Tabbelen samenvoegen.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Deadangel

Legacy Member
Bon, ik heb dus 2 tabellen;

1 = festival_facts & 1 = nieuws

Festival_facts
- Fesitval_id
- Gebruikers_id
- Titel
- Bericht
- Datum
- foto

En dus ook nieuws;
Nieuws
- nieuws_id
- Gebruikers_id
- Titel
- Bericht
- Datum

Nu zou ik willen, dat het recentste bericht word ge-echo'd. Dus als ik een nieuw nieuwsbericht post, er bevoorbeeld komt; "nieuwsbericht", en als het recentste bericht een festival-fact was, er komt; "Festival Fact";

Iemand een idee hoe ik dit doe ? :)

Cycloon

Legacy Member
Slecht databasemodel, als je dit wil doen moet je toch wel een idiote query samenstellen.

Cycloon

Legacy Member
Deadangel zei:

Verklaar? Zoals ik al zei, als je dit wil bereiken met 1 query ga je gewoon een belachelijke query moeten samenstellen, iets in de zin van:

SELECT CASE (SELECT max from tabel1) > (SELECT max from tabel2) THEN 'Label1' ELSE 'label2' FROM dummy

Maar daar is een database eigenlijk niet voor gemaakt, dan kan je met jouw database model even goed 2 queries sturen om de nieuwste posts in beide tabellen op te halen en dan vergelijken met een if'ke (da's ook praktisch wat deze query doet).

Obliv`

Legacy Member
Ik ken geen MySql, maar deze query zal wel werken in Oracle / Sql Server, enkel de selectie van de eerste rij is anders (rownum = 1, top 1).

SELECT Type, FestivalId, Titel, Bericht, Datum
FROM
(
SELECT 'Festival' AS Type, FestivalId, Titel, Bericht, Datum
FROM FestivalFacts
UNION ALL
SELECT 'Nieuws' AS Type, NieuwsId, Titel, Bericht, Datum
FROM FestivalFacts
) Result
WHERE ROWNUM = 1
ORDER BY Datum DESC;

Je zou zoals eerder gezegd beter je databasemodel herzien. Je spitst eigelijk twee types van nieuwsberichten op over verschillende tabellen. In jou geval is het beter om de festival facts en de nieuwsberichten samen te houden in 1 table en er gewoon een 'type' (festival, news, ...) column aan toe te voegen.

passero

Legacy Member
obliv, kdenk niet dat die query werkt.

Uw rownum wordt VOOR de order by toegekend. HEt kan dus zijn dat uw rownum = 1 het 10de records is na een order by.
Probeer maar eens met een random tabel:
select rownum, t.* from table t order by t.randomVeld;

Kheb dat probleem ook al gehad in oracle trouwens, vandaar dak er vrij zeker van ben.

Obliv`

Legacy Member
passero zei:
obliv, kdenk niet dat die query werkt.

Uw rownum wordt VOOR de order by toegekend. HEt kan dus zijn dat uw rownum = 1 het 10de records is na een order by.
Probeer maar eens met een random tabel:
select rownum, t.* from table t order by t.randomVeld;

Kheb dat probleem ook al gehad in oracle trouwens, vandaar dak er vrij zeker van ben.

@passero:

Ahja, das just. Hoe zou dit dan wel juist gaan? Misschien met iets als dit: ROWNUMBER() OVER (PARTITION BY Id ORDER BY Datum DESC).

Mijn kennis ligt meer bij SQL Server, waardat met TOP 1 wel een pak simpeler is ;).

passero

Legacy Member
ge moet uw order by binnen zetten en dan een select (.... ) where rownum = 1 doen:
select * from (
SELECT Type, FestivalId, Titel, Bericht, Datum
FROM
(
SELECT 'Festival' AS Type, FestivalId, Titel, Bericht, Datum
FROM FestivalFacts
UNION ALL
SELECT 'Nieuws' AS Type, NieuwsId, Titel, Bericht, Datum
FROM FestivalFacts
) Result
ORDER BY Datum DESC) t
where rownum = 1;

zo iets :)
Op die manier forceert ge de order by eerst uit te voeren.
Alhoewel ik nie 100% zeker ben of dit geen syntax error ga geven omda ik nie zeker ben of die order by op die plaats mag... Maar ik dacht van wel.

Obliv`

Legacy Member
Ja zoiets mag wel hoor.

Ik vroeg me enkel af of er geen manier was zodat je er niet nóg eens een query moest rond schrijven :).

Cycloon

Legacy Member
Je kan met
Code:
row_number() over(order by datum) as rownumber
werken als extra kolom en dan where rownumber = 1 doen. Dan heb je die extra select en order by clausule niet meer nodig :)

Kemblin

Legacy Member
kunt ge niet gewoon orderen en dan met 'LIMIT 1' werken?

*edit: zoiets dus?
Code:
(SELECT Festival_id AS Type_id, Gebruikers_id, Titel, Bericht, Datum FROM FestivalFacts)
UNION ALL
(SELECT Nieuws_id AS Type_id, Gebruikers_id, Titel, Bericht, Datum FROM Nieuws)
ORDER BY Datum DESC LIMIT 1

passero

Legacy Member
limit werkt natuurlijk niet in oracle... Daarvoor gaat ge nu net die rownum gebruiken.
Maar ik denk dat TS het wel over mysql heeft en daar werkt diene limit natuurlijk wel.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan