Komplizierte MySQL Datenbankabfrage

g4mmler

Mitglied
Hi,
Ich habe ein Problem mit einer komplizierten Datenbankabfrege.
Das Problem ist zwar sehr kompliziert aber ich versuche es bestmöglich zu beschreben.
(Habe mithilfe der sufu nichts gefunden)

Ich möchte bei dieser abfrage mehrere eingegebene Daten mit mehreren dazu passenden Spalten vergleichen und die Ergebnisse danach Sortiert nach der höchsten Anzahl von übereinstimmenden Feldern ausgeben.

Stimmt also Eingabe A mit dem Feld A im Datenbankeintrag 1 überein, Feld B aber nicht
und in Datenbankeintrag 2 stimmen beide überein dann soll erst Datenbankeintrag 2 und dann 1 angezeigt werden.

Beispiel:

Eingabe: A=1 B=2 C=3 D=4
DBE 1. : A=1 B=5 C=4 D=7 1 Treffer
DBE 2. : A=1 B=5 C=3 D=8 2 Treffer
DBE 2. : A=1 B=2 C=3 D=4 4 Treffer

Ausgabe:

DBE1
DBE2
DBE3

1. Lösungsansatz über MySql
PHP:
<?php
include '../login/check.php';
include '../inc/config.php';

$max = 10;

$connectionid  = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR
	die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());

mysql_select_db(MYSQL_DATABASE) OR
        die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());

$sql = "SELECT * FROM products";
$sql2 ="
          (SELECT age FROM products WHERE age = ".$_REQUEST["age"].")
union all (SELECT sex FROM products WHERE sex LIKE ".$_REQUEST["sex"].")
union all (SELECT reason FROM products WHERE reason LIKE ".$_REQUEST["reason"].")
union all (SELECT musik_genre FROM products WHERE musik_genre LIKE ".$_REQUEST["music_genre"].")
union all (SELECT musik_year FROM products WHERE musik_year LIKE ".$_REQUEST["music_year"].")
union all (SELECT hobby1 FROM products WHERE hobby1 LIKE ".$_REQUEST["hobby1"].")
union all (SELECT hobby2 FROM products WHERE hobby2 LIKE ".$_REQUEST["hobby2"].")
union all (SELECT color1 FROM products WHERE color1 LIKE ".$_REQUEST["color1"].")
union all (SELECT color2 FROM products WHERE color2 LIKE ".$_REQUEST["color2"].")
union all (SELECT attitude FROM products WHERE attitude LIKE ".$_REQUEST["attitude"].")

GROUP BY ID count(ID) AS hits DESC

ORDER BY hits;";

$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result))
{
  echo $row[ID]." -> ".$row[hits];
}
?>

Lösungsansatz mit php:
PHP:
<?php
$result = mysql_query("SELECT * FROM products LIMIT 0,$max");

$hits;

while ($row = mysql_fetch_assoc($result))
{
  $hits[$row["ID"]] = 0;
  
  if($_REQUEST["age"] > $row["age"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["sex"] == $row["sex"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["reason"] == $row["reason"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["music_genre"] == $row["music_genre"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["music_year"] == $row["music_year"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["hobby1"] == $row["hobby1"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["hobby2"] == $row["hobby2"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["color1"] == $row["color1"])
  {
    $hits[$row["ID"]] +=1;
  }
  if($_REQUEST["color2"] == $row["color2"])
  {
    $hits[$row["ID"]] +=1;
  }
  
  echo $hits[$row["ID"]];
}
?>

Ich würde das Problem wenn möglich gerne in Mysql lösen, da der Vorgang so schneller abläuft.
Ich hoffe es kann mir jmd Helfen, die Suche sollte nämlich möglichst bis morgen fertig sein.

Danke im Vorraus,

Pascal Jacob
 
PHP:
'SELECT
        ID,
        (age = "'.mysql_real_escape_string($_REQUEST["age"]).') +
        (sex LIKE "'.mysql_real_escape_string($_REQUEST["sex"]).'") +
        (reason LIKE "'.mysql_real_escape_string($_REQUEST["reason"]).'") +
        (musik_genre LIKE "'.mysql_real_escape_string($_REQUEST["music_genre"]).'") +
        (musik_year LIKE "'.mysql_real_escape_string($_REQUEST["music_year"]).'") +
        (hobby1 LIKE "'.mysql_real_escape_string($_REQUEST["hobby1"]).'") +
        (hobby2 LIKE "'.mysql_real_escape_string($_REQUEST["hobby2"]).'") +
        (color1 LIKE "'.mysql_real_escape_string($_REQUEST["color1"]).'") +
        (color2 LIKE "'.mysql_real_escape_string($_REQUEST["color2"]).'") +
        (attitude LIKE "'.mysql_real_escape_string($_REQUEST["attitude"]).'") AS matches
  FROM
        products
  ORDER BY
        matches'
 
Danke für die schnelle Antwort
Nur leider treten bei dieser Abfrage 2 Fehler auf:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/../search.php on line 33

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /usr/export/../search.php on line 35
 
Die Datenbankabfrage schlug wegen eines Sytaxfehlers fehl weil ich ein Anführungszeichen vergessen habe.
 
Nein daran lag es leider nicht.
Habe das bereits behoben:

PHP:
$sql2 = 'SELECT
        ID,
        (age = "'.mysql_real_escape_string($_REQUEST["age"]).'") +
        (sex LIKE "'.mysql_real_escape_string($_REQUEST["sex"]).'") +
        (reason LIKE "'.mysql_real_escape_string($_REQUEST["reason"]).'") +
        (musik_genre LIKE "'.mysql_real_escape_string($_REQUEST["music_genre"]).'") +
        (musik_year LIKE "'.mysql_real_escape_string($_REQUEST["music_year"]).'") +
        (hobby1 LIKE "'.mysql_real_escape_string($_REQUEST["hobby1"]).'") +
        (hobby2 LIKE "'.mysql_real_escape_string($_REQUEST["hobby2"]).'") +
        (color1 LIKE "'.mysql_real_escape_string($_REQUEST["color1"]).'") +
        (color2 LIKE "'.mysql_real_escape_string($_REQUEST["color2"]).'") +
        (attitude LIKE "'.mysql_real_escape_string($_REQUEST["attitude"]).'") AS matches
  FROM
        products
  ORDER BY
        matches'  ;
 
Danke hat mir sehr geholfen.
Die Abfrage ist nun fehlerfrei. Allerdings weiß ich nicht ob sie ihren Zweck erfüllt,
denn es wird immer 2 ausgegeben.

Für den fall dass ich nichts in das Formular eingebe ist die Ausgabe 2 und wenn ich bei Alter 20 eingebe ( in der datenbank exixstiert ein eintrag mit age = 20) ist die Ausgabe trotzdem 2
 
Zurück