Seite 1 von 1

INNER JOIN php Frage an die Freaks ;)

Verfasst: 05.04.2011, 15:35
von Medium
Hallo,

habt mir ja schon mal geholfen ;)

ich habe Artikel bzw. Produkte -> Tabelle tx_item_produkt
ich habe Kategorien -> Tabelle tx_item_Cat
ind eine Hilfstabelle -> tx_item_produkt_category_mm

über die Variable $auswahl möchte ich später stuern welche Kategorien angezeigt werden sollen.

in tx_item_produkt_category_mm wird jedes Artikel-Kategorie-Verhältnis in eine Zeile geschrieben

Bild

mein Code sieht so aus:

Code: Alles auswählen

			$sql = "SELECT *
            FROM tx_item_produkt
            INNER JOIN tx_item_produkt_category_mm ac ON ( ac.uid_local = tx_item_produkt.uid )
			INNER JOIN tx_item_Cat c ON ( c.uid = ac.uid_foreign )";

            if ($auswahl == '') {
                        }else {
                        $sql .="WHERE ac.uid_foreign IN ($auswahl)";
            }

			$abfrage = mysqli_query($verbindung, $sql);

			while($articel = mysqli_fetch_assoc($abfrage)){

                        echo "<tr>";
						echo "<td>$articel&#91;uid&#93; </td>";
						echo "<td>$articel&#91;title&#93; </td>";
						echo "<td>$articel&#91;text&#93;</td>";
                        echo "<td>$articel&#91;category&#93;</td>";
						echo "</tr>";

			&#125;
			echo "</table>";
			mysqli_free_result&#40;&#41;;
leider gibt er mir wieder Artikel die in mehreren Kategorien sind sopplet usw. aus :(

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 07.05.2011, 06:22
von Outman
Was steht denn bei dein Skript in der Variable: $auswahl? Sind dies Zahlen mit Komma getrennt? Gegebenenfalls könntest du mit distinct bzw. GROUP BY was machen. Ich finde auf den ersten Blick deine Bezeichnungen von den Spalten sehr unpassend.

Verwende für die Zukunft nicht uid für id. Denn uid kann man immer dazu interpretieren, dass dies eine User-ID ist. Desweiteren würde ich an deiner Stelle auch Tabellennamen nie abkürzen wie zum Beispiel "tx_item_produkt_category_mm ac" dadurch verliert man einfach den Überblick. Du kannst dies im Nachhinein sobald du fertig bist, abändern.

Schreibe lieber:

... (`tx_item_produkt_category_mm`.`uid_local` = `tx_item_produkt`.`uid` ) ...


und lasse dir mal $sql bevor du die Abfrage von der Mysql Datenbank machst ausgeben. Bei * solltest du noch angeben, welche Tabelle du hier meinst. Beispiel:

`tx_item_produkt_category_mm`.*

Verfasst: 08.05.2011, 10:22
von nerd
SELECT DISTINCT ... !

Verfasst: 08.05.2011, 15:45
von Outman
nerd hat geschrieben:SELECT DISTINCT ... !
hatte ich bereits geschrieben :wink:

Verfasst: 08.05.2011, 22:32
von nerd
stimmt. liegt daran das ich grundsaetzlich nur die erste zeile pro beitrag lese. spart ne menge zeit :)

Verfasst: 15.05.2011, 13:14
von mgutt
1.) tx_item_produkt_category_mm hast Du weil jeder Artikel auch in mehreren Kategorien stehen kann, korrekt?

2.) Warum INNER JOIN? Gibt es Artikel ohne Kategorien? Wenn nein wäre ein simpler JOIN die bessere Wahl bzw. noch besser die implizite Schreibweise:

Code: Alles auswählen

// alle artikel aus allen kategorien
$sql = "SELECT *
				FROM &#40;tx_item_produkt p, tx_item_produkt_category_mm pc, tx_item_Cat c&#41;
				WHERE pc.uid_local = p.uid
				AND c.uid = pc.uid_foreign";
// nur aus bestimmten kategorien
if &#40;$auswahl&#41; &#123; // wenn $auswahl == '' dann ist das gleich false ;&#41;
	$sql .= ' AND pc.uid_foreign IN&#40;' . mysql_real_escape_string&#40;$auswahl&#41; . '&#41;';
&#125;
3.) Ich finde Deine Spalten und Tabellennamen reichlich verwirrend. Was soll der Quatsch mit der uid? Nenn das doch einfach product_id und cat_id und nicht local und foreign.