webForumDet fria alternativet

INNER JOIN 2 tabeller?

15 svar · 672 visningar · startad av Guldstrand

GuldstrandMedlem sedan juli 20041 271 inlägg
#1

Jag försöker att hämta kolumnen "name" från två olika tabeller, (till en tredje tabell), men jag får inte till det riktigt.

Den tredje tabellen (stores) innehåller:

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `owner` int(10) unsigned NOT NULL,
  `company` int(10) unsigned NOT NULL,
  `association` int(10) unsigned NOT NULL,
  `desc` text NOT NULL,

Poster i stores:

INSERT INTO `stores` (`id`, `owner`, `company`, `association`, `desc`) VALUES
(1, 1, 0, 2, 'text här'),
(2, 1, 33, 0, 'text här');
@ndersMedlem sedan juni 200032 969 inlägg
#2

Jag läser och läser, men jag kan inte förstå frågan.

(desc är f.ö. inte alls bra som fältnamn, eftersom det är ett reserverat ord. )

GuldstrandMedlem sedan juli 20041 271 inlägg
#3

@nders skrev:

Jag läser och läser, men jag kan inte förstå frågan.

(desc är f.ö. inte alls bra som fältnamn, eftersom det är ett reserverat ord. )

Tack för tipset ang. "desc", ska ändra detta.

Tabellen "stores" fungerar som en relationstabell mellan "associations" och "companies".
Jag vill nu hämta ut name från både "associations" och "companies".

Har testat med följande fråga:

SELECT * 
FROM stores
LEFT JOIN companies ON companies.id = stores.company
LEFT JOIN associations ON associations.id = stores.association

..den fungerar direkt i phpmyadmin, men vet inte riktigt hur jag plockar ut name. :r

@ndersMedlem sedan juni 200032 969 inlägg
#4
SELECT companies.name as CompanyName, associations.name as AssociationName, * 
FROM stores
LEFT JOIN companies ON companies.id = stores.company
LEFT JOIN associations ON associations.id = stores.association

Referera sedan till CompanyName resp. AssociationName.

GuldstrandMedlem sedan juli 20041 271 inlägg
#5

Ok, jag förstår det, men är ändå osäker på hur jag ska få till det i följande kod.

$menu = "<option value='0'>---- Välj butik ----</option>\n";
$ct_r = mysql_query("SELECT * FROM stores LEFT JOIN companies ON companies.id = stores.company LEFT JOIN associations ON associations.id = stores.association") or die(mysql_error());
while ($ct_a = mysql_fetch_array($ct_r))

  $menu .= "<option value=\"" .intval($ct_a["id"]). "\">" .htmlspecialchars($ct_a["name"]). "</option>\n";
@ndersMedlem sedan juni 200032 969 inlägg
#6

Vad är problemet? Ändra SQL-frågan efter mitt förslag, och referera till $ct_a["AssociationName"] resp. $ct_a["CompanyName"] istället för $ct_a["name"].

GuldstrandMedlem sedan juli 20041 271 inlägg
#7

Hmm.. går det inte att ha ett "samlat" namn för båda? *svårt att förklara*

Min nuvarande kod, ger följande:

<option value='0'>---- Välj butik ----</option>
<option value="2">Föreningsnamn</option>
<option value="0"></option>

..allstå verkar inte någon data hämtas från tabellen "companies"?

(Det finns 2 butiker i "stores", 1 förening och ett företag.)

@ndersMedlem sedan juni 200032 969 inlägg
#8

Öh, va? Du får berätta vad du håller på med - vi kan inte läsa i din hjärna.
Med en join får du ut två olika fält. Fundera på om du ska ha en UNION istället.
Men hur ska du hantera "id"? Hur tänkte du hålla koll på vad som är en "association" och vad som är ett "company"? Varför är det olika tabeller? Vad är det för skillnad på "company" och "association"?

GuldstrandMedlem sedan juli 20041 271 inlägg
#9

@nders skrev:

Öh, va? Du får berätta vad du håller på med - vi kan inte läsa i din hjärna.
Med en join får du ut två olika fält. Fundera på om du ska ha en UNION istället.
Men hur ska du hantera "id"? Hur tänkte du hålla koll på vad som är en "association" och vad som är ett "company"? Varför är det olika tabeller? Vad är det för skillnad på "company" och "association"?

Det är ingen större skillnad på de två tabellerna, mer än att den ena endast innehåller information om företag, och den andra för föreningar.

Resp. ID, hanteras i "stores" med kolumnerna company och association.

@ndersMedlem sedan juni 200032 969 inlägg
#10

Min nuvarande kod, ger följande:
Kod:
<option value='0'>---- Välj butik ----</option>
<option value="2">Föreningsnamn</option>
<option value="0"></option>
..allstå verkar inte någon data hämtas från tabellen "companies"?

Hur menar du att koden ser ut nu då alltså?

GuldstrandMedlem sedan juli 20041 271 inlägg
#11

Som ovan:

$menu = "<option value='0'>---- Välj butik ----</option>\n";
$ct_r = mysql_query("SELECT * FROM stores LEFT JOIN companies ON companies.id = stores.company LEFT JOIN associations ON associations.id = stores.association") or die(mysql_error());
while ($ct_a = mysql_fetch_array($ct_r))

  $menu .= "<option value=\"" .intval($ct_a["id"]). "\">" .htmlspecialchars($ct_a["name"]). "</option>\n";
@ndersMedlem sedan juni 200032 969 inlägg
#12

Om du tittar på hur resultatet ser ut (i t.ex. phpmyadmin) så förstår du varför det blir som det blir. Du har två fält med samma namn - och när du försöker hämta värden så hämtas det från "det första" fältet med det namnet. Därför måste du:

  1. Ange olika namn enligt mitt exempel. Då får du kontrollera med php: är fältet CompanyName inte tomt, visa värdet från det. Är det tomt - visa istället värdet från fältet AssociationName. Eller:
  2. Se till att SQL-frågan bara har ett fält med namn i - antingen genom en UNION, eller med en CASE i select. Eller:
  3. Se till att använda EN tabell för "companies" och "associations". Jag kan inte se (med den information du gett hittills) att det finns någon anledning att ha olika tabeller.
GuldstrandMedlem sedan juli 20041 271 inlägg
#13

Ok! Så du menar alltså att man ska blanda föreningar med företag, i samma tabell?
Hur smart är det, när man sedan vill kunna skilja dem åt?

@ndersMedlem sedan juni 200032 969 inlägg
#14

Det är smart.

Om datat är snarlikt finns det ingen anledning att dela på det i olika tabeller. Sätt en flagga bara, en kolumn som kan heta "StoreType" - värde 1 kan vara företag, värde 2 kan vara förening.

GuldstrandMedlem sedan juli 20041 271 inlägg
#15

@nders skrev:

Det är smart.

Om datat är snarlikt finns det ingen anledning att dela på det i olika tabeller. Sätt en flagga bara, en kolumn som kan heta "StoreType" - värde 1 kan vara företag, värde 2 kan vara förening.

Förstår hur du tänker.
Kanske blir bäst (OCH enklast) att slå ihop de båda tabellerna då. :r

@ndersMedlem sedan juni 200032 969 inlägg
#16

Är det stor skillnad på datat som de två olika typerna av "stores" kräver så är det klart att det bör vara olika tabeller. Men man ska akta sig för att dela upp för mycket. Om man gör ett register över datorspel till exempel, då har man ju inte olika tabeller för äventyrsspel, actionspel och sportspel - de lagrar man på samma ställe med någon sorts information om kategori (antingen direkt med en flagga i tabellen eller med poster i en relationstabell).

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)