$select

crunch

Mitglied
Hallo Jungs,

ich hab schon fleissig gegoogelt und leider nichts gefunden.

Wie schreibt man diese Abfrage hier korrekt?

$sql = 'Select id, var1, var2 from tab';

$select = 'SELECT id FROM '.$sql.''; (hier ist irgendwo ein Fehler!)

Danke!
 
Angesichts der Tatsache, dass ich bei dieser Abfrage keinen Grund für eine Unterabfrage sehe, könntest du das Problem so lösen:
Code:
SELECT `id` FROM `tab`
 
Hi.

ok :). Mein Beispiel war wohl etwas zu einfach gewählt.

Also eigentlich habe ich eher so etwas hier

PHP:
	function getUmkreis() {
	$ortIDs = array();

          
	$sql = 'SELECT id, plz, ort, 
		ACOS(SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675))
		+ COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l)
		- RADIANS(10.7289164659405))
		) * 6380 AS distance
		FROM plz
		WHERE ACOS(
			SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675))
			+ COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l)
			- RADIANS(10.7289164659405))
			) * 6380 < 10
		ORDER BY distance';

	$select = 'SELECT id FROM '.$sql.''; /* (hier liegt, glaube ich, das Problem) */


          $this->DB->query($select);

          $i = 0;

          while($this->DB->next_record()) {

                $ortIDs[] = $this->DB->f("ortIDs");

          }

     return $ortIDs;
	}

und hier versuche ich dann auszulesen

PHP:
$myOrt = new stadt;

$myOrteIDs = array();
$myOrteIDs = $myStadt->getUmkreis();

echo sizeof($myOrteIDs);
echo "jetzt: ";
echo $myOrteIDs[$ii];
echo "<br>";


	     		for ($ii=0; $ii<sizeof($myOrteIDs); $ii++ ) {

                

                	$ort = $myOrt->getOrtData($myOrteIDs[$ii]);  /* (hier hab ich ein Problem mit dem mehrdimensionalen Array) */

		?>			
  			<option value="<?php echo $myOrt->plz ?>"><?php echo $myOrt->ort ?></option>

<?php } ?>
 
Zuletzt bearbeitet:
Ich versteh nicht, warum du dort eine Unterabfrage brauchst. Frag doch die nötigen Datensätze direkt aus deiner großen Abfrage (die mit den Winkelfunktionen) ab und fertig ist das Ganze.
 
ich möchte am ende nur die

IDs in meinem Array ($myOrteIDs) haben. Momentan habe ich ja einen Array mit allem drin.

In dem SELECT muss ich allerdings zumindest ACOS mit auslesen.

Es würde mir auch helfen, wenn ich entweder erst in #temp auslesen würde und dann aus #temp selecte. (weiß allerdings nicht wie das aussehen müsste)

ODER: wenn ich aus dem array anschliessend nur die IDs ansprechen könnte.

Ich hoffe das Problem ist jetzt deutlicher.

Gruß,
Dominik
 
Ich versteh dich immer noch nicht ganz. Am besten sagst du uns einfach, was du am Ende in dem Array für Werte haben willst und dann basteln wir gemeinsam die Abfrage so zusammen, wie du sie brauchst.
 
Ich hinterfrage jetzt nicht, sondern sage dir wo eine Problem liegen könnte.

PHP:
$select = 'SELECT id FROM '.$sql.''; /* (hier liegt, glaube ich, das Problem) */
müsste her so aussehen
PHP:
$select = 'SELECT id FROM ('.$sql.') AS sub'; /* (hier liegt, glaube ich, das Problem) */

Wobei du so nur die ID hast, Den Ort, Distanz etc. verlierst du.
 
:) ok

dann fange ich am besten noch einmal ganz vorne an.

Code:
CREATE TABLE `plz` (
  `id` int(10) NOT NULL auto_increment,
  `land` varchar(5) NOT NULL default '',
  `bundesland` varchar(50) NOT NULL default '',
  `bezirk` varchar(50) NOT NULL default '',
  `kreis` varchar(50) NOT NULL default '',
  `frei` varchar(50) NOT NULL default '',
  `ort` varchar(50) NOT NULL default '',
  `geo_l` double NOT NULL default '0',
  `geo_b` double NOT NULL default '0',
  `plz` varchar(6) NOT NULL default '',
  `bland` varchar(5) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=13348 ;

--
-- Daten für Tabelle `plz`
--

INSERT INTO `plz` (`id`, `land`, `bundesland`, `bezirk`, `kreis`, `frei`, `ort`, `geo_l`, `geo_b`, `plz`, `bland`) VALUES
(5078, 'DE', 'Sachsen', 'Dresden', 'Kreisfreie Stadt Dresden', '-', 'Dresden', 13.7210676148814, 51.0600336463379, '01067', 'S')
...

...

Das ist meine Tabelle "plz".

Aus dieser Tabelle möchte ich nun die Städte auslesen, die in 10 Kilometer Umkreis von Gunzenhausen liegen:

(1) Ich brauche die Geodaten von Gunzenhausen

PHP:
$sql = 'SELECT * FROM `plz` WHERE `ort` LIKE \'Gunzenhausen%\' LIMIT 1 ';

(2) Mit Hilfe der Geodaten von Gunzenhausen und meiner Funktion "Umkreissuche" aus der Klasse "Stadt" suche ich nun alle Städte in 10 Kilometer Umkreis:

PHP:
	function getUmkreis() {
	$ortIDs = array();

          
	$select = 'SELECT id, plz, ort, 
		ACOS(SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675))
		+ COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l)
		- RADIANS(10.7289164659405))
		) * 6380 AS distance
		FROM plz
		WHERE ACOS(
			SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675))
			+ COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l)
			- RADIANS(10.7289164659405))
			) * 6380 < 10
		ORDER BY distance';


          $this->DB->query($select);

          $i = 0;

          while($this->DB->next_record()) {

                $ortIDs[] = $this->DB->f("ortIDs");

          }

     return $ortIDs;
	}

Wie man sieht, gibt die Funktion Umkreissuche $ortIDs zurück. PROBLEM: da stehe jetzt nicht nur die IDs drin, sondern auch "plz", "ort" und "distance". "plz" und "ort" brauche ich eigentlich in dem SELECT nicht. "distance" hingegen schon.

Deshalb wollte ich anschliessend noch einmal NUR alle IDs selektieren, damit ich dann hier mit dem array($myOrteIDs) weiterarbeiten kann.

PHP:
<?php

$myOrt = new stadt;

$myOrteIDs = array();
$myOrteIDs = $myStadt->getUmkreis();

echo sizeof($myOrteIDs);
echo "jetzt: ";
echo $myOrteIDs[$ii];
echo "<br>";


	     		for ($ii=0; $ii<sizeof($myOrteIDs); $ii++ ) {

                

                	$ort = $myOrt->getOrtData($myOrteIDs[$ii]);

		?>			
  			<option value="<?php echo $myOrt->plz ?>"><?php echo $myOrt->ort ?></option>
		
<?php } ?>

Mit der Funktion "getOrtData" aus der Klasse "stadt" könnte ich mir dann wieder mit Hilfe der ID die nötigen Infos (plz, ort, ...) auslesen.

Das war jetzt bestimmt wieder viel zu kompliziert. Also die Frage nochmal auf einem Punkt gebracht:

Wie kann ich es erreichen, dass in dem Array $myOrteIDs am Ende nur die IDs stehen und nicht "distance"?

War das jetzt klarer?

Sorry... hab vielleicht einfach schon zu viel Stunden davor gesessen :).
 
Sorry yaslaw. hab deinen Eintrag gerade erst gesehen.

Bekomme leider auch damit eine Fehlermeldung:

Database error: Invalid SQL: SELECT id FROM (SELECT id, plz, ort, ACOS(SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675)) + COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l) - RADIANS(10.7289164659405)) ) * 6380 AS distance FROM plz WHERE ACOS( SIN(RADIANS(geo_b)) * SIN(RADIANS(49.1096938300675)) + COS(RADIANS(geo_b)) * COS(RADIANS(49.1096938300675)) * COS(RADIANS(geo_l) - RADIANS(10.7289164659405)) ) * 6380 < 10 ORDER BY distance) AS sub
MySQL Error: 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id, plz, ort, ACOS(SIN(RADIANS(geo_b)) * SIN(RADIANS(4)
Session halted.
 
- Du kannst die distance drin lassen und einfach ignorieren
- du kannst die Berechung auch in den ORDER BY tun und im SELECT_Teil ignorieren
- Du kannst es wie von dir geplant mit einer Unterabfrage lösen (ist am schönsten, da die Berechnung nur einmal ausgeführt wird.

In deiner Berechnung sehe ich nirgens die Koordinaten von Gunzenhausen um die Distanz zu rechnen......

Ich habe mal die Berechnung rausgenommen. Zudem grenze ich schon sehr früh ein Quadrat um Gunzenhausen (+-10) ein, damit nicht alle Daten von ganz Deutschland berechnet werden müssen

SQL:
SELECT calc.id
FROM
	(SELECT id
		/* Berechnung der genauen Distanz mit  pb, pl, zb, zl*/ AS distance
	FROM 
		(SELECT 
			plz.geo_b as pb, 
			plz.geo_l as pl,
			zentrum.geo_b as zb, 
			zentrum.geo_l as zl,
		FROM plz		
			(SELECT geo_b, geo_l
			FROM plz
			WHERE ort LIKE 'Gunzenhausen%') AS zentrum	
		WHERE plz.geo_b BETWEEN zentrum.geo_b + 10 AND zentrum.geo_b +10
	) AS calc
WHERE calc.distance < 10
ORDER BY calc.distance
 
Zuletzt bearbeitet von einem Moderator:
Zurück