Mehrere Datenbanken eine quary Problem

Hallo ich entwickle derzeitig mit php eine Umgebungssuche für meine Postgre Datenbaken und habe folgende Probleme:

  1. Bin ich mir noch nicht sicher wie ich es am Besten lösen kann um 2 Datenbanken (nicht nur tables) zu durchsuchen und das Ergebnis zu mergen (vllt mit UNION). Das zusammengefügte Ergebnis muss auch immer noch richtig Sortiert sein. Habt ihr vielleicht tipps für mich?

  2. Merkwürdiger weise scheint der UNION Befehl nicht zu funktionieren oder schmeißt nur Fehler. Ich versuche einfach nur 2x die gleiche Query durchlaufen zu lassen und die Ergebnisse zu mergen (als test). Wenn ich die query nur einfach ausführe gibt es keinerlei Probleme…

SELECT name, type, ST_Distance(ST_SetSRID(st_makepoint($newcenter1,$newcenter2),4326), ST_SetSRID(the_geom,4326),true), ST_Y(ST_SetSRID(the_geom,4326)), ST_X(ST_SetSRID(the_geom,4326)) 
from points 
where st_dwithin(st_makepoint($newcenter1,$newcenter2), the_geom, $newdistance, true) AND name IS NOT NULL AND type = '$newproxType' 
ORDER BY ST_Distance(st_makepoint($newcenter1, $newcenter2), the_geom), name 
LIMIT 50
UNION
SELECT name, type, ST_Distance(ST_SetSRID(st_makepoint($newcenter1,$newcenter2),4326), ST_SetSRID(the_geom,4326),true), ST_Y(ST_SetSRID(the_geom,4326)), ST_X(ST_SetSRID(the_geom,4326)) 
from points 
where st_dwithin(st_makepoint($newcenter1,$newcenter2), the_geom, $newdistance, true) AND name IS NOT NULL AND type = '$newproxType' 
ORDER BY ST_Distance(st_makepoint($newcenter1, $newcenter2), the_geom), name 
LIMIT 50

Mit UNION wie oben gezeigt sagt er aber immer (die im Fehler beschriebene Zeile ist die letzte Zeile aus der quary):

Warning: pg_query(): Query failed: ERROR: syntax error at or near "UNION" LINE 5: UNION ^ in /Applications/XAMPP/xamppfiles/htdocs/prototype1/proximitySearch.php on line 25
Abfrage fehlgeschlagen: ERROR: syntax error at or near "UNION" LINE 5: UNION ^

Vielen Dank für eure Zeit!

Michael_He

Du kannst nicht so ohne weiteres aus 2 unterschiedlichen Datenbanken selektieren, das brauchst eher was wie FDW (Foreign Data Wrapper). Das ist ein anderes Thema.

Um erst einmal zu Deinem UNION was zu sagen, Du machst derzeit sowas wie:

test=# create table foo as select * from generate_Series(1,10) s;
ERROR:  relation "foo" already exists
Time: 0,238 ms
test=*# drop table foo;
DROP TABLE
Time: 25,464 ms
test=*# create table foo as select * from generate_Series(1,10) s;
SELECT 10
Time: 1,438 ms
test=*# -- damit hast erst mal eine Tabelle
test=*# select * from foo order by s limit 5 union all select * from foo order by s limit 5;
ERROR:  syntax error at or near "union"
LINE 1: select * from foo order by s limit 5 union all select * from...
                                             ^
Time: 0,124 ms
test=*# -- hier ist Dein Fehler
test=*# select * from (select * from foo order by s limit 5) bla union all (select * from foo order by s limit 5);
 s
---
 1
 2
 3
 4
 5
 1
 2
 3
 4
 5
(10 rows)

Time: 0,348 ms
test=*# -- und das wäre die Lösung
test=*# rollback;
ROLLBACK
Time: 0,769 ms

Wenn das wirklich aus 2 Datenbanken kommen soll, so solltest Du das noch mal prüfen und evtl. nur unterschiedliche Schemas innerhalb einer DB nutzen oder aber Dich intensiv mit FDW beschäftigen.

Hallo vielen Dank für die Antwort. Ja ich versuche jetzt einfach unterschiedliche schemas zu benutzen nur kann ich da irgendwie nicht drauf zugreifen. Ich bekomm beim eintragen in die Datenbank:

    function insertInDatabase($point1,$point2,$userid,$name,$type,$description,$image,$visibility)
    {
    	$userid = pg_escape_string($userid);
        $name = pg_escape_string($name);
        $type = pg_escape_string($type);
        $description = pg_escape_string($description);
        $image = pg_escape_string($image);
        $visibility = pg_escape_string($visibility);
        $time = date("Y-m-d H:i:s");

    	$dbconn = pg_connect("host=localhost port=5432 dbname=deutschlandPOI user=dezign password=dezign")
    	or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());

        $sql = "INSERT INTO userFeatures.points(the_geom, user_id, name, type, description, image, visibility, timestamp) VALUES(ST_GeomFromText('POINT($point1 $point2)', 900913), '$userid', '$name', '$type', '$description', '$image', '$visibility', '$time')";

    	$result = pg_query($sql) or die('Eintragen fehlgeschlagen!'/* . pg_last_error()*/);
	}

immer diese Fehlermeldung:

<br />
<b>Warning</b>:  pg_query(): Query failed: ERROR:  relation "userfeatures.points" does not exist
LINE 1: INSERT INTO userFeatures.points(the_geom, user_id, name, typ...
                    ^ in <b>/Applications/XAMPP/xamppfiles/htdocs/prototype1/includes/pointToDatabase.php</b> on line <b>23</b><br />
Eintragen fehlgeschlagen!

Jedoch bin ich mir sicher das sie existiert und ich ich habe auch schon geguckt ob die “Rechte”-Einstellungen richtig sind und ich sehe dort keine Fehler…
Datenbankaufbau: (datenbank.schema.table) deutschlandPOI.userFeatures.points

was mir auffällt: du hast da eine großen Buchstaben drin, das F von Features. Wenn das Schema tatsächlich so angelegt ist, dann mußt Du beim Zugriff darauf das auch passend quoten, sonst greift er, siehe Fehlermeldung, auf lowercase, also userfeatures.points, zu, und die gibt es nicht.

“userFeatures” ist ein andere Name als “userfeatures” oder userfeatures.

Details hier: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

P.S.: es heißt Postgres oder PostgreSQL, niemals Postgre

Vielen Dank das war der Fehler! :slight_smile: