2016-04-15 2 views
1

beginnt Ich habe ein lästiges Problem, dass die diese SQL-I ohne UNIONWie eine UNION SQL-Abfrage neu zu schreiben, so dass es mit SELECT

(SELECT entry_id, url_title, channel_id, entry_date, title 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
ORDER BY entry_date asc 
LIMIT 2) 
UNION 
(SELECT entry_id, url_title, channel_id, entry_date, title 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 6 
    AND status = 'open' 
    AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
ORDER BY entry_date asc LIMIT 1) 
UNION 
    (SELECT entry_id, url_title, channel_id, entry_date, title 
    FROM exp_channel_titles 
    WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
    ORDER BY entry_date asc LIMIT 1,2) 
    LIMIT 3; 

So schreiben müssen, was sie tut, ist select 2 Nachrichten Geschichten dann ein Ereignis in die zukünftige "Geschichte" dann, wenn keine Ereignisgeschichte eine andere Nachrichtengeschichte hinzufügt.

Also zwei Kategorien, aber eine hat eine andere Auswahl, so gewichtet gibt es immer 3 aber wenn möglich ein Ereignis.

Ich muss über eine Möglichkeit nachdenken, dies mit Joins zu tun, oder ohne die Klammern() zu starten, um es einfacher zu machen. Wo ich lade, mag es UNION nicht.

+1

können Sie verwenden mit einem SQL-Export der relevanten Tabellen (Erstellung und Daten) auf diese Weise können Menschen arbeiten auf Ihnen viel einfacher zu helfen – Jester

+0

Sie brauchen nicht die Klammern jetzt – RiggsFolly

+0

Wickeln Sie die ganze Sache mit 'SELECT * FROM (.. ..) '? – trincot

Antwort

0

Die Antwort am Ende benötigt zusätzliche SELECT und AS alias zu jeder Unterabfrage

SELECT * FROM ( 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 5 
     AND status = 'open' 
     ORDER BY entry_date asc LIMIT 2) 
    AS news 
UNION 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 6 
     AND status = 'open' 
     AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
     ORDER BY entry_date asc LIMIT 1) 
    AS gallery 
UNION 
    SELECT * FROM (SELECT entry_id, url_title, channel_id, entry_date, title 
     FROM exp_channel_titles 
     WHERE channel_id = 5 
     AND status = 'open' 
     ORDER BY entry_date asc LIMIT 1,2) 
    AS more_news 
) AS articles LIMIT 3; 

scheint MySQL, wenn Sie wickeln() mit einem SELECT * es braucht jetzt sie verbinden anders so each() muss jetzt sei SELECT * FROM() AS alias, was ein bisschen übertrieben ist, aber sinnvoll ist, da es alle Spalten verfügbar machen will.

Ich möchte immer noch eine leichtere Lösung, da dies eine Menge Schritte ist, aber es funktioniert, so gut mit mir.

+0

Danke an @Luis Siquot und Trincot für Richtung – tristanbailey

1

Dies ist die korrekte Syntax:

select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 1 as comesFrom 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
ORDER BY entry_date asc 
LIMIT 2) AS part1 
UNION 
select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 2 as comesFrom 
FROM exp_channel_titles 
WHERE exp_channel_titles.channel_id = 6 
    AND status = 'open' 
    AND entry_date > ((unix_timestamp(Now()))+(2*86400)) 
ORDER BY entry_date asc LIMIT 1) as part2 
UNION 
select * from (SELECT entry_id, url_title, channel_id, entry_date, title, 3 as comesFrom 
    FROM exp_channel_titles 
    WHERE exp_channel_titles.channel_id = 5 
    AND status = 'open' 
    ORDER BY entry_date asc LIMIT 1,2) as part3 
-- may be you want an order by here also 
LIMIT 3; 

Ich habe auch ein comesFrom Feld hinzufügen, um einen Flag in dem letzten Re-Cord zu wissen, wo die bestimmte Datensatz herkommt. Es ist in einigen Fällen nützlich.

+0

Entschuldigung, ich habe nicht genug Englisch Fähigkeiten, um die Details zu erklären –

+0

Danke Ich liebe diese Idee. Hatte nicht daran gedacht. Werde es am Morgen versuchen. Und wählen Sie es aus, es funktioniert. – tristanbailey

+0

Es war die richtige Richtung, aber MySQL benötigt extra SELECT und AS Alias ​​für jeden Sub() – tristanbailey

Verwandte Themen