Select och Join

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
snylften



Medlem i: 3724 dagar

Status: Offline



#741311
Inlägg Skrivet: 2017-01-02 15:10      Ämne: Select och Join Citera

Hej och god fortsättning
Jag har två tabeller. En med kategorier och en kopplingstabell som kopplar ihop en kategori med en kund som ligger i en kundtabell.
Jag vill skriva ut alla kategorier samt summera ihop hur många kunder som har kopplingar till respektive kategori.
Det har jag lyckats med. Men om det finns en kategori som inte har någon koppling till ett företag så skrivs den inte ut. Jag vill få med ALLA kategorier oavsett om de har koppling till en kund eller inte.

Här är min SQL sats som bara skriver ut kategorierna som har kopplingar mot kunder. Hur kan jag modifiera den så att den skriver ut resterande kategorier som inte har kopplingar till några kunder?
KOD:
1:
SELECT COUNT(rcc.customer_id) AS numCats, c.category, c.category_id FROM relation_categorys_customers rcc JOIN categories c ON rcc.category_id=c.category_id GROUP BY rcc.category_id



Här är tabellerna med lite data också Smile

KOD:
1:
CREATE TABLE IF NOT EXISTS `categories` (
2:
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
3:
  `category` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
4:
  PRIMARY KEY (`category_id`)
5:
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=14 ;
6:
 
7:
--
8:
-- Dumping data for table `categories`
9:
--
10:
 
11:
INSERT INTO `categories` (`category_id`, `category`) VALUES
12:
(1, 'Bil & kjøretøy'),
13:
(2, 'Bilforhandlare'),
14:
(3, 'Bensinstasjoner'),
15:
(4, 'Restauranter, gatekjøkken og kafeer'),
16:
(5, 'Sport, hobby og fritid'),
17:
(6, 'Barnevogner og -utstyr'),
18:
(7, 'Leker'),
19:
(8, 'Bildeler og rekvisita'),
20:
(9, 'Bilutleie'),
21:
(10, 'Bruktbilforhandlere'),
22:
(11, 'Golf'),
23:
(12, 'Camping'),
24:
(13, 'Møbler og inredning');


KOD:
1:
CREATE TABLE IF NOT EXISTS `relation_categorys_customers` (
2:
  `customer_id` int(11) NOT NULL,
3:
  `category_id` int(11) NOT NULL,
4:
  PRIMARY KEY (`customer_id`,`category_id`)
5:
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
6:
 
7:
--
8:
-- Dumping data for table `relation_categorys_customers`
9:
--
10:
 
11:
INSERT INTO `relation_categorys_customers` (`customer_id`, `category_id`) VALUES
12:
(1, 1),
13:
(2, 11),
14:
(3, 1),
15:
(4, 1),
16:
(5, 13),
17:
(6, 13),
18:
(7, 1),
19:
(8, 1),
20:
(9, 1),
21:
(10, 11),
22:
(12, 1),
23:
(13, 1),
24:
(14, 1),
25:
(16, 1),
26:
(17, 1),
27:
(20, 13),
28:
(22, 1),
29:
(23, 11),
30:
(25, 4),
31:
(26, 4),
32:
(30, 4),
33:
(31, 4),
34:
(33, 4),
35:
(34, 4),
36:
(35, 4),
37:
(36, 11),
38:
(37, 1),
39:
(38, 12),
40:
(44, 4),
41:
(45, 4),
42:
(48, 4),
43:
(54, 11),
44:
(54, 12),
45:
(56, 4),
46:
(63, 12),
47:
(64, 11),
48:
(66, 1),
49:
(67, 1),
50:
(68, 1),
51:
(69, 11),
52:
(85, 5),
53:
(86, 5),
54:
(93, 1),
55:
(95, 12),
56:
(99, 12),
57:
(107, 13),
58:
(109, 11),
59:
(110, 1),
60:
(112, 12),
61:
(114, 5),
62:
(115, 5),
63:
(116, 5),
64:
(117, 5),
65:
(118, 1),
66:
(120, 1),
67:
(122, 1),
68:
(124, 11),
69:
(128, 1),
70:
(129, 13),
71:
(130, 1);
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Azreal
Administratör



Medlem i: 4190 dagar
Från: Uppsala, bor i Göteborg
Status: Offline



#741312
Inlägg Skrivet: 2017-01-02 15:13      Ämne: Citera

Läs lite om hur JOIN fungerar i denna tråd: http://www.phpportalen.net/viewtopic.php?t=37634
 

_________________
Konsultation via PM, inte gratis.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
snylften



Medlem i: 3724 dagar

Status: Offline



#741313
Inlägg Skrivet: 2017-01-03 09:31      Ämne: Citera

Tack för svaret. Det var lärorikt.

Nu kör jag istället
KOD:
1:
SELECT
2:
COUNT(rcc.customer_id) AS numCats,
3:
c.category, c.category_id
4:
FROM categories c
5:
LEFT JOIN relation_categorys_customers rcc ON c.category_id =rcc.category_id
6:
GROUP BY rcc.category_id


Men det lustiga här är att jag endast får ut en kategori som inte har någon kund kopplad till sig då den borde returnera många fler än en? Detta är mycket skumt och jag kan inte klura ut varför? Antingen borde SQL satsen returnera alla kategorier eller endast de som har en kund kopplat i kopplingstabellen? Nu får jag alla som har en koppling plus EN kategori utan koppling?... Blir inte riktigt klok på det här 😂
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2992 dagar

Status: Offline



#741319
Inlägg Skrivet: 2017-01-04 12:33      Ämne: Citera

snylften skrev:
KOD:
1:
SELECT
2:
COUNT(rcc.customer_id) AS numCats,
3:
c.category, c.category_id
4:
FROM categories c
5:
LEFT JOIN relation_categorys_customers rcc ON c.category_id =rcc.category_id
6:
GROUP BY rcc.category_id


Antingen borde SQL satsen returnera alla kategorier eller endast de som har en kund kopplat i kopplingstabellen? Nu får jag alla som har en koppling plus EN kategori utan koppling?... Blir inte riktigt klok på det här 😂

(Förutsatt att jag förstod dig rätt här)
Fråga dig själv om varför du skrev "LEFT JOIN", och inte bara "JOIN". Det finns olika typer av JOIN, nämligen.
Vanliga JOIN, som ger matchande rader från båda tabeller.
LEFT JOIN, som ger raderna från den vänstra tabellen. Sen försöker den hitta matchande rader i högertabellen enligt villkoret(ON ...). Om det misslyckas så läggs dock raden ändå till i resultatet, men med kolumnerna från den högra tabellen tomma.
RIGHT JOIN, se ovan Smile.
INNER JOIN,
OUTER JOIN, se nedan.
Tänk dig höger och vänster tabell som två delvis överlappande cirklar bredvid varann, rader som har matchningar i båda tabeller är den överlappande delen. INNER och OUTER avser rader inom eller utanför den överlappande delen. LEFT och RIGHT avser rader till vänster eller höger om den överlappande delen. (Man kan inkludera eller exkludera den överlappande delen i resultatet beroende på hur man skriver villkoren(ON ...).
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic