Avatar billede RippieUK Nybegynder
01. marts 2010 - 14:42 Der er 5 kommentarer og
1 løsning

Kan jeg forenkle disse mysql queries ?

Hej alle sammen,

Kan nogen hjælpe mig forbedre min code ? Koden kommer her nedenfor og forklaring kommer efter min code

<?php
include 'details.php';

#connect to db server, select db   
$connectionString = @mysql_connect(host, db_user, db_pass);
$selectDb = @mysql_select_db(db);

$query = mysql_query("SELECT * from spVendors ORDER BY vendName asc");
while($row = mysql_fetch_array($query)) {
    echo "<strong>".$row['vendName']."</strong> <br />";
    $query2 = mysql_query("SELECT * from spProducts WHERE vendID = '".$row['vendID']."' ORDER BY prodName asc");
    while($row2 = mysql_fetch_array($query2)) {
        echo "".$row2['prodName']." : ";
        $query3 = mysql_query("SELECT *
        FROM spProductSkills
        INNER JOIN spPeople
        ON spProductSkills.userID=spPeople.userID
        WHERE spProductSkills.prodID = '".$row2['prodID']."'
        ORDER BY spProductSkills.userID");

        $count = mysql_num_rows($query3);

        if($count == 0) {
            echo "no engineers";
        } else {
            while($row3 = mysql_fetch_array($query3)) {
                echo "".$row3['userName'].", ";
            }
        }
    echo "<br />";
    }
   
}
?>

Jeg har 4 tabeller: Vendors - Products - People - ProductSkills

Jeg ønsker en side der viser hvem kan gøre hvilke produkter og jeg har taget metoden at vendor tabellen har vendorID og vendorName. Products har prodID prodName and vendorID. People tabellen har userID og userName. ProductSkills har prodID, userID, vendorID

Jeg tror jeg er på rette spor, men ville meget gerne have lidt feedback om jeg kan forenkle dette.

Rippie
Avatar billede arne_v Ekspert
01. marts 2010 - 14:46 #1
Kan du ikke lave en enkelt SELECT som joiner alle 4 tabeller?
Avatar billede RippieUK Nybegynder
01. marts 2010 - 15:18 #2
Ville være rart, men hvordan lister jeg så alle produkter under en vendor, og skriver ud engineers for de enkelte produkter ? og hvis der ikke er en engineer at den så skriver ingen engineer.

Så gode råd er meget velkommen.
Avatar billede arne_v Ekspert
01. marts 2010 - 21:51 #3
Du sorterer med:

... ORDER BY vendor,produkt,engineer

Og så skal din applikation tester for når man skifter vendor eller produkt.
02. marts 2010 - 07:22 #4
Fordi jeg ikke selv havde proevet saadan noget foer proevede jeg for oevelse at finde en loesning hvor du ikke bliver ved med at gaa frem og tilbage til databasen.  Jeg laver en join query der leverer alle informationerne paa en gang.  Hver $row slaar jeg op i en array $table der saaledes bliver en todimensional array, en array der indeholder arrays.  Saa skriver jeg $table ud saaledes at hver gang $table[x]['vendName'] forandres skriver jeg den ud og derefter skriver jeg alle $table[x]['prodName'] ud og enten $table[x]['userName'] eller, hvis den er blank, "no engineers."

Jeg lavede de fire testtabeller og fyldte lidt data i.  Med de data og nedenstaaende kode faar jeg dette resultat udskrevet:

vendor1
product1: user1
product1: user2
product2: user3
vendor2
product3: no engineers
product4: user2
product4: user3
vendor3
product5: no engineers
product6: user1
product6: user2
product6: user3

Var det omtrent dette du soegte?

Jeg giver her koden.  Den kan du i oevrigt proevekoere paa http://christianjorgensen.be/rippie.php

<?
$link = mysql_connect ('xxx', 'yyyy', 'zzzz') or die(mysql_erorr());
mysql_select_db('qqqq') or die('Could not select database');
$result = mysql_query("SELECT vendName, prodName, userName
FROM rippie_vendors v
JOIN rippie_products p ON v.vendID = p.vendorID
LEFT JOIN (SELECT productId, userName FROM rippie_productSkills ps
JOIN rippie_people pe ON ps.userID = pe.userID) AS pu
ON p.productID = pu.productID") or die(mysql_error());
while($row = mysql_fetch_array($result)) $table[] = $row;
$vendor = "";
for($i=0; $i<count($table); $i++)
{
  if($table[$i]['vendName'] != $vendor)
  {
    echo "<strong>" . $table[$i]['vendName'] . "</strong><br/>";
    $vendor = $table[$i]['vendName'];
  }
  echo $table[$i]['prodName'] . ": ";
  if($table[$i]['userName'] != "") echo $table[$i]['userName'] . "<br/>";
  else echo "no engineers<br/>";
}
mysql_close($link);
?> 

Jeg haaber dette er nyttigt.
04. marts 2010 - 06:02 #5
RippieUK, fik du mit indlaeg?  Hvad er din reaktion?
Avatar billede RippieUK Nybegynder
08. marts 2010 - 12:39 #6
Hej Christian,

Glemte helt det her spørgsmål, har acceptertet dit svar... jeg fik hjælp fra en anden person og koden er anderledes der, men din kode ser også nice ud.

Ronnie
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester