2016-10-19 2 views
1

So habe ich eine Übersetzungstabelle, die verschiedene Darstellungen eines Ortsnamens enthält. Ich schließe mich dieser Tabelle auf der placeId, wo diese Tabelle als die rechte Seite dient (die linke Seite enthält Informationen über die place).Mehrere Datensätze in der rechten Tabelle in 1 Datensatz der linken Tabelle filtern

Der Beitritt zu placeId führt jedoch möglicherweise zu mehr Übersetzungen, siehe Tabelle unten. Der Inhalt von preferredName/shortName/historicName sind alle 0 oder 1. Es gibt jedoch keine Regel, dass jede Übersetzung mindestens 1 Datensatz mit preferredName=1 haben sollte.

Also, was ich am Ende mit ist: Wie kann ich nur 1 dieser Übersetzungen wählen, insbesondere:

  • wenn Datensatz mit preferredName=1 existiert: Verwenden Sie diese
  • else if Datensatz mit shortName=1 besteht: Verwendung wenn diese
  • sonst weder wahr ist (so sind beide 0), dann diesen Datensatz holen

.

+---------------+---------+------------------+---------------+-----------+--------------+ 
| translationId | placeId | alternateName | preferredName | shortName | historicName | 
+---------------+---------+------------------+---------------+-----------+--------------+ 
|   4832 |  554 | 'New York'  |    1 |   0 |   0 | 
|   4833 |  554 | 'NY'    |    0 |   1 |   0 | 
|   4834 |  554 | 'New York City' |    0 |   0 |   0 | 
+---------------+---------+------------------+---------------+-----------+--------------+ 

Irgendwelche Anhaltspunkte? Es läuft im Wesentlichen darauf hinaus, mehrere Übereinstimmungen in der rechten Tabelle mit 1 Datensatz in der linken Tabelle zu filtern.

+0

Sortieren nach "PreferredName" und " ShortName ", und dann, wählen Sie das erste Ergebnis;) –

+0

Wie würden Sie das tun, wenn Sie 10 Orte zu diesen Übersetzungen zusammenbringen; Ich möchte 10 Datensätze in diesem Fall (mit jedem Datensatz, der die entsprechende Übersetzung als Feld hat) zurückgeben – Flame

+0

Sie können Ihre beitreten auf einem Unterantrag 'wählen ... von ... Reihenfolge von ...' und vielleicht 'Grenze 1 ' –

Antwort

0

Sie 3-mal mit verschiedenen Bedingungen beitreten könnten und COALESCE die Ergebnisse:

select 
a.*, 
coalesce(name1.alternateName, name2.alternateName, name3.alternateName) as alternateName 
from _table1_ as a 
left join _table2_ as name1 on (a.placeId = name1.placeId and name1.preferredName=1) 
left join _table2_ as name2 on (a.placeId = name2.placeId and name2.shortName=1) 
left join _table2_ as name3 on (a.placeId = name3.placeId and name3.preferredName=0 and name3.shortName=0) 
group by a.placeId 
+0

Ich werde das in einem Moment ausprobieren; nur 1 Sache: die Paare 1-1, 1-0, 0-1 und 0-0 können alle für preferredName/shortName existieren (Paare können sogar doppelt existieren, aber dann können wir auch beides). So sollte es 1-1 vor 1-0, 1-0 vor 0-1 und 0-1 vor 0-0 – Flame

0

meinen vorherigen Kommentar Folgen, können Sie Ihre Anfrage auf einem subrequest JOIN machen.

versuchen Sie dies:

SELECT * FROM mytable WHERE placeId = 554 ORDER BY preferredName DESC, shortName DESC; 

es wird Ergebnisse bestellen genau so, wie Sie wollen, mit Ihrem preferrence. Juste fügen Sie eine Grenze 1 Ameise, die Sie haben Recht!

SELECT * FROM mytable WHERE placeId = 554 ORDER BY preferredName DESC, shortName DESC LIMIT 1; 

so, man muss nur ersten Teil der Anfrage hinzufügen und Ihre dazu kommen lassen;)

EDIT: die folgenden ist in Bezug auf einen Kommentar

LEFT OUTER JOIN 
    (SELECT * FROM alternatename 
    WHERE isoLanguage="NL" AND geonameid = a1.geonameid 
    ORDER BY isPreferredName DESC, isShortName DESC 
    LIMIT 1 
    ) 
    AS alternate10 
ON 
    alternate10.geonameid = a1.geonameid 
+0

hmm ja dies scheint das Problem zu lösen; Allerdings: ich benutze eine ziemlich große Datenmenge, und ich habe gerade diese Unterabfrage in meine Hauptabfrage erstellt und es fügte 13 Sekunden zur Ausführungszeit hinzu. – Flame

+0

Wenn Sie möchten, wir versuchen, Ihre Anfrage zu optimieren, können Sie uns Ihre Hauptanforderung zeigen? Diese Anfrage ist ziemlich schnell, also denke ich, dass wir dann an deinem Haupt arbeiten müssen und vielleicht finden, dass Index in deinem Fall nützlich sein kann. –

+0

http: // Pastebin.com/tqG0N5ds das ist die allgemeine Idee. Hinweis: Die Volltextsuche (MATCH/AGAINST) ist nicht der Täter. Abfrage führt in 50 ms oder so, wenn keine Unterabfragen – Flame

Verwandte Themen