2016-07-21 3 views
1

nehme ich das folgende Schema:Wählen Sie zuerst N Artikel pro Beziehung, haben eine Zeile pro Artikel

Künstler:

+------------+------------------+------+-----+---------+----------------+ 
    | Field  | Type    | Null | Key | Default | Extra     | 
    +------------+------------------+------+-----+---------+----------------+ 
    | id   | int(10) unsigned | NO | PRI | NULL | auto_increment |     | 
    | name  | varchar(255)  | YES | UNI | NULL |    | 
    +------------+------------------+------+-----+---------+----------------+ 

Ereignisse:

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra    | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment  | 
| date  | timestamp  | YES |  | NULL |    | 
| artist_id | int(11)   | YES |  | NULL |    | 
| venue_id | int(11)   | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

Vermögen:

+---------------------+------------------+------+-----+---------+----------------+ 
| Field    | Type    | Null | Key | Default | Extra   | 
+---------------------+------------------+------+-----+---------+----------------+ 
| id     | int(10) unsigned | NO | PRI | NULL | a 
| event_id   | int(11)   | YES |  | NULL |     
| source_asset_title | varchar(255)  | YES |  | NULL |    | 
| source_created_time | timestamp  | YES |  | NULL |    | 

Und ich wollte eine Ergebnismenge von 4 Vermögenswerte für jedes Ereignis für einen bestimmten artist.id, nach Veranstaltungsdatum sortiert, wie:

+----------+----------+------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+ 
| event_id | asset_id | source_asset_title                          | event_date   | date    | 
+----------+----------+------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+ 
|  1 |  2089 | aba                              | 2015-12-03 07:00:00 | 2015-12-03 07:00:00 | 
|  1 |  2101 | abb                              | 2015-12-03 07:00:00 | 2011-04-07 15:30:00 | 
|  1 |  2102 | abc                             | 2015-12-03 07:00:00 | 2011-05-22 16:00:00 | 
|  1 |  2107 | abd                              | 2015-12-03 07:00:00 | 2011-06-11 15:00:00 | 
|  2 |  2109 | abe                              | 2011-07-18 15:00:00 | 2011-07-18 15:00:00 | 
|  2 |  2113 | abf                             | 2011-07-18 15:00:00 | 2011-07-24 15:30:00 | 
|  2 |  2115 | abg                             | 2011-07-18 15:00:00 | 2011-08-25 16:00:00 | 
|  2 |  2123 | abh                             | 2011-07-18 15:00:00 | 2011-08-28 16:00:00 | 
|  3 |  2126 | abi                             | 2011-09-01 16:00:00 | 2011-09-01 16:00:00 | 
|  3 |  2129 | abj                             | 2011-09-01 16:00:00 | 2011-09-10 16:00:00 | 
|  3 |  2135 | abk                             | 2011-09-01 16:00:00 | 2011-10-14 16:00:00 | 
|  3 |  2147 | abl                             | 2011-09-01 16:00:00 | 2011-10-22 16:00:00 | 

Wie konnte ich diese pro Ereignis ohne eine Unterabfrage erreichen?

Ich glaube, dass das Schema und die Ergebnismenge hier unterscheidet sich genug von anderen Fragen auf StackExchange, dass eine neue Frage angemessen ist. Hier

+0

Können Sie einen Dump oder Sqlfiddle bereitstellen, also haben wir einige Daten, mit denen wir spielen können? – Philipp

+0

Sie könnten GROUP_CONCAT und http://stackoverflow.com/a/23608554/308851 – chx

+0

@chx verwenden Danke! Ich glaube, dass GROUP_CONCAT alle Werte der Asset-Tabelle in einer einzigen Ergebniszeile als Zeichenfolge platziert, die nicht mit der Ausgabe übereinstimmt, die ich bekommen möchte. (Das Endziel ist, json zurückzugeben, der die Anlagen beschreibt). –

Antwort

0

Nein, es ist nicht möglich die angegebene Ergebnismenge ohne Unterabfragen zu erreichen. Betrachten Sie alternativ GROUP_CONCAT, obwohl Sie möglicherweise die Größe von MySQL group_concat_max_len erhöhen müssen, um alle Spalten einzuschließen, die Sie beschreiben möchten. Dies kann oder auch nicht eine gute Idee sein.

0

ist die SQL für artist.id = 1, bestellt von neueren auf ältere von events.date

SELECT 
    events.id as event_id, 
    assets.id as asset_id, 
    source_asset_title 
FROM assets 
INNER JOIN events ON events.id = assets.event_id 
INNER JOIN artists ON artists.id = events.artist_id 
WHERE artists.id = 1 
ORDER BY events.date DESC 
+0

Danke, aber dies berücksichtigt nicht die Grenze "4 Assets für jede Veranstaltung", die ich als den herausfordernden Teil der Frage sehe. Diese Abfrage zeigt eine Zeile für jedes Asset an. –

+2

Ich glaube nicht, dass Sie dieses Rätsel lösen können, ohne Unterabfragen ... –

+0

Aber warten Sie auf andere Antworten –

Verwandte Themen