PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Volltextsuche MATCH AGAINST mit LEFT JOIN kombinieren.L



Gutschy
24-05-2004, 16:15
So hier mal mein Versuch in Datenbankabftragen von MySQL.:eek:



$sql="SELECT nummer,artikel,zusatz,brutto,lieferant,name";
$sql.=" FROM artikelk WHERE MATCH (artikel) AGAINST";
$sql.=" ('+$artikel' IN BOOLEAN MODE) LEFT JOIN adressen ";
$sql.="ON kunde=lieferant";


Also die Abfrage funktioniert bis zu 'LEFT JOIN' ganz gut. Liegt wohl daran das LEFT JOIN einfach von mir angehängt worden ist.:rolleyes:

Es gibt die beiden Tabellen "artikelk" und "adressen", die Variable "$artikel" sucht mir aus "artikelk" alle passenden Felder, bis auf "name" dieses Feld stammt aus der Tabelle "adressen". Die beiden Tabelle verknüpfen sich über die Felder "kunde" und "lieferant". Was aber nur eine Fehlermeldung auslößt

In meinem Lehrbuch steht die Möglichkeit es mit temporären Tabellen zu versuchen.

Auch hier mal mein Versuch:



<head>
<title>check</title>
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<

<?php
$artikel=$HTTP_POST_VARS['artikel'];
include("funk.php");
include("verbind.php");

$sqlt="CREATE TEMPORARY TABLE tmp";
$sqlt.="SELECT nummer,artikel,zusatz,brutto,lieferant";
$sqlt.=" FROM artikelk WHERE MATCH (artikel) AGAINST";
$sqlt.=" ('+$artikel' IN BOOLEAN MODE)";

mysql_query($sqlt)

$sql="SELECT t.nummer,t.artikel,t.zusatz,t.brutto,t.lieferant,a .name";
$sql.="FROM tmp AS t";
$sql.="INNER JOIN adressen AS a ON t.lieferant=a.kunden";

if ($res=send_sql($db,$sql)) {
echo "Abfrage: <br> $sql"; }
tab_out($res);


if ($res=send_sql($db,$sql)) {
echo "SQL-Kommando wurde ausgeführt";
}
?>
<br>
<a href="suchlieferant.html">Neue Suche.</a><br><br>
<a href="menue.html">Zur&uuml;ck zur Auswahl</a>
</body>
</html


Freihändig Coden ist wohl noch nicht mein Ding, hier auf jeden Fall versuche ich erst ein Temporäre Tabelle zu erzeugen und die dann anschließend mit der Tabelle "adressen" zu verknüpfen, was aber nur zu einem Syntax Fehler führt.:(

Hans-Georg Normann
25-05-2004, 19:23
Hi Gutschy

Ich kenne zwar "MATCH AGAINST" nicht, aber mir schein deine Syntax etwas "verdreht" zu sein. Versuch es doch einmal so

$sql="SELECT nummer,artikel,zusatz,brutto,lieferant,name";
$sql.=" FROM artikelk LEFT JOIN adressen ";
$sql.=" ON (kunde=lieferant) ";
$sql.=" WHERE MATCH (artikel) AGAINST";
$sql.=" ('+$artikel' IN BOOLEAN MODE) "; IMO mußt du erst die Joins aufbauen bevor du mit der WHERE Klausel anfängst.

Hans

Gutschy
26-05-2004, 11:38
Danke Hans,

hat super geklappt. "MATCH AGAINST" ist seit Version 3.23.23 dabei und in Version 4.0.1 noch verbessert worden. Hat einen ähnlichen Effekt wie 'like' oder '=',kann aber "ungefähr" vergleichen. So ne Art Fuzzy Logik. Gibt auch Treffer aus für Wörter die so ähnlich ausschauen.


Edit:
Genauer, wo es nur eine Teilübereinstimmung gibt.

Hans-Georg Normann
26-05-2004, 21:08
Ist MATCH AGAINST eigentlich Bestandteil von Standard SQL?

Hans

Gutschy
27-05-2004, 09:16
Tja, also mein Buch (Markt&Technik, MySQL4) beschreibt diesen Ausdruck unter dem Kapitel "Syntax und Verwendung von SQL in MySQL", dann hab ich noch bei Oracle kurz reingeschaut, die hat es glaub ich auch.

Also ich schätze mal das es dazu gehört.:confused:

Hans-Georg Normann
27-05-2004, 18:35
Mir ist heute ein Buch untzergekommen, wo MATCH für Informix erklärt war, ohne AGAINST. Da sind die Metazeichen dann Bahs - like.

Also ich vermute, dass das in der Form ein Feature von MySQL ist und nicht zum Standard SQL zu zählen ist.

Hans

Christoph
28-05-2004, 10:38
Laut Date/Darwen "SQL - der Standard" ist MATCH Bestandteil von SQL2, aber in einer ganz anderen Bedeutung, nämlich zum Vergleich einer Zeile mit einer Tabelle, die von einem Subselect zurückgegeben wird. Einziges optionales Schlüsselwort bei MACTH ist UNIQUE. Date gibt dazu folgendes Beispiel:


SELECT * FROM sp WHERE NOT (sp.sno MATCH UNIQUE (SELECT s.sno FROM s))

Wenn UNIQUE also nicht angegeben ist, dann ist MATCH äquivalent zu einem normalen Subselect mit IN.

Ein Vergleich mit einer Art regulären Ausdrücken ist in SQL3 mit dem Operator SIMILAR TO möglich.