Vinnaren i pepparkakshustävlingen!
2009-03-03, 17:03
  #1
Medlem
Eftersom Eforum är dränerat på kompetens nuförtiden så försöker vi här istället..

Har satt upp en MySQL-databas som jag lägger upp register över importörer, återförsäljare och tillverkare. Där finns två tabeller till där jag kopplar ihop tillverkare och importörer samt tillverkare och återförsäljare. Detta är koden:

Kod:
SELECT
manufacturer.m_ID,
manufacturer.m_Name,
retailer.r_ID,
retailer.r_Name,
r_brands.r_ID,
r_brands.m_ID
FROM
manufacturer ,
retailer
Inner Join r_brands ON retailer.r_ID = r_brands.r_ID AND manufacturer.m_ID = r_brands.m_ID
ORDER BY
retailer.r_Name ASC

Felet som jag får (php uppgav inte felkod eller liknande, så jag kör SQL-koden i Navicat) är "Unknown column 'manufacturer.m_ID' in 'on clause'. Okej att det var ett tag sen man körde SQL, men jag ser inte vad jag gjort för fel.. hilfe?!
Citera
2009-03-03, 17:20
  #2
Medlem
pikzels avatar
Det enda jag kan tänka på är att du gör "from manufacturer, retailer", jag vet inte hur MySQL tolkar det när du har JOIN.
Citera
2009-03-03, 17:33
  #3
Medlem
Citat:
Ursprungligen postat av pikzel
Det enda jag kan tänka på är att du gör "from manufacturer, retailer", jag vet inte hur MySQL tolkar det när du har JOIN.

Okej.. MySQL följer ju annars SQL rätt bra. Förslag på hur jag skall göra istället?
Citera
2009-03-03, 19:54
  #4
Medlem
gadzooxs avatar
Håll dig till den ena typen av joins, blanda inte bägge syntaxerna i samma query. Vid implicit join (kommaseparerade tabellnamn) använder man WHERE för att sätta upp villkoren, medan man vid explicit join (INNER/OUTER JOIN) definierar villkoren efter ON .... Den blir nog smått förvirrad när du blandar dem.

Som jag ser det joinar du in r_brands enbart för att kunna koppla samman poster i manufacturer och retailer, en many-to-many-relation med andra ord. Borde inte detta funka?

Kod:
SELECT
    m.m_ID, m.m_Name, r.r_ID, r.r_Name
   ,rb.m_ID, rb.r_ID  -- de här två är redundanta, samma värden som m.m_ID och r.r_ID
FROM manufacturer m
INNER JOIN r_brands rb ON m.m_ID = rb.m_ID
INNER JOIN retailer r ON rb.r_ID = r.r_ID
ORDER BY r.r_Name

Läs mer om olika typer av joins här


Edit: för den goda sakens skull kan väl även visa en implicit many-to-many inner join:
Kod:
SELECT
    m.m_ID, m.m_Name, r.r_ID, r.r_Name, rb.m_ID, rb.r_ID
FROM manufacturer m, r_brands rb, retailer r 
WHERE m.m_ID = rb.m_ID
AND r.r_ID = rb.r_ID
ORDER BY r.r_Name
...antar jag... brukar inte använda den här syntaxen.
__________________
Senast redigerad av gadzoox 2009-03-03 kl. 19:57.
Citera
2009-03-03, 23:17
  #5
Medlem
Citat:
Ursprungligen postat av gadzoox
Håll dig till den ena typen av joins, blanda inte bägge syntaxerna i samma query. Vid implicit join (kommaseparerade tabellnamn) använder man WHERE för att sätta upp villkoren, medan man vid explicit join (INNER/OUTER JOIN) definierar villkoren efter ON .... Den blir nog smått förvirrad när du blandar dem.

Som jag ser det joinar du in r_brands enbart för att kunna koppla samman poster i manufacturer och retailer, en many-to-many-relation med andra ord. Borde inte detta funka?

Kod:
SELECT
    m.m_ID, m.m_Name, r.r_ID, r.r_Name
   ,rb.m_ID, rb.r_ID  -- de här två är redundanta, samma värden som m.m_ID och r.r_ID
FROM manufacturer m
INNER JOIN r_brands rb ON m.m_ID = rb.m_ID
INNER JOIN retailer r ON rb.r_ID = r.r_ID
ORDER BY r.r_Name

Läs mer om olika typer av joins här


Edit: för den goda sakens skull kan väl även visa en implicit many-to-many inner join:
Kod:
SELECT
    m.m_ID, m.m_Name, r.r_ID, r.r_Name, rb.m_ID, rb.r_ID
FROM manufacturer m, r_brands rb, retailer r 
WHERE m.m_ID = rb.m_ID
AND r.r_ID = rb.r_ID
ORDER BY r.r_Name
...antar jag... brukar inte använda den här syntaxen.


Tackar! Efter att tidigare ikväll ha plöjt igenom MySQLs dokumentation så insåg jag att jag missat lite i koden. Den här varianten rekommenderades av MySQL:

Kod:
SELECT
manufacturer.m_Name, retailer.r_Name
FROM
manufacturer join retailer Join r_brands on retailer.r_ID=r_brands.r_ID and manufacturer.m_ID=r_brands.m_ID
order BY
retailer.r_Name asc, manufacturer.m_Name asc

Fast din kod funkade fint den med!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback