Query met LEFT JOIN hulp nodig
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT
main.id,
main.name,
main.url,
main.content,
COUNT(sub.id) AS count_sub,
COUNT(subsub.id) AS count_subsub
FROM
table_modules_forum AS main
LEFT JOIN
table_modules_forum_topics AS sub
ON(
sub.parent_id = main.id AND sub.status = 'true' AND sub.deleted = 'true'
)
LEFT JOIN
table_modules_forum_messages AS subsub
ON(
subsub.parent_id = sub.id AND subsub.status = 'true' AND subsub.deleted = 'true'
)
WHERE
main.language_id = '".$this->language."' AND main.status = 'true' AND main.deleted = 'true'
GROUP BY
main.id
ORDER BY
main.order_count ASC
main.id,
main.name,
main.url,
main.content,
COUNT(sub.id) AS count_sub,
COUNT(subsub.id) AS count_subsub
FROM
table_modules_forum AS main
LEFT JOIN
table_modules_forum_topics AS sub
ON(
sub.parent_id = main.id AND sub.status = 'true' AND sub.deleted = 'true'
)
LEFT JOIN
table_modules_forum_messages AS subsub
ON(
subsub.parent_id = sub.id AND subsub.status = 'true' AND subsub.deleted = 'true'
)
WHERE
main.language_id = '".$this->language."' AND main.status = 'true' AND main.deleted = 'true'
GROUP BY
main.id
ORDER BY
main.order_count ASC
Alleen nu krijg ik de verkeerde counts want ik krijg:
ipv
Loop al een tijdje te klooien maar krijg het niet voor elkaar, kan iemand helpen?
Gewijzigd op 04/08/2011 11:28:16 door Joakim Broden
Bumpje :)
De query moet een hele dik fout opleveren!!
En nee, ik krijg geen hele dikke fout..
Oetzie cookie op 05/08/2011 22:03:11:
Als je dan ook gelijkt zet waarom of hoe of wat of hoe het beter kan, zeg het dan want dan heb ik en misschien anderen er nog wat van. En anders hou je je maar stil...
En nee, ik krijg geen hele dikke fout..
En nee, ik krijg geen hele dikke fout..
Als ik schrijf dat die query een fout zal moeten geven en geen resultset moet opleveren, dan is het aan jouw om daar over na te gaan denken en uit te zoeken wat er dan fout zit. M.a.w. leer de ins en outs van je database en verhoog je SQL kennis.
Maar ja, zodra je de fout herstelt hebt dan nog zal je niet het resultaat verkrijgen wat je hebben wilt en moet je je query alsnog herschrijven.
Je hoeft geen kant en klare oplossing te geven, maar zo'n nietszeggend antwoord als jij geeft helpt niemand verder en dat lijkt mij wel de bedoeling van dit forum.
Maar ja, ik heb je op dit forum nog nooit een constructieve bijdrage zien posten, dus misschien kun je gewoon niet anders. Je reacties zijn vrijwel altijd aanmatigend en doorspekt van frases als "slaat natuurlijk ook nergens op" en "gooi dit maar heel rap in de prullenak".
OT:
Wel zet ik vraagtekens bij de geneste structuur van de JOIN en of dat zo gaat werken, maar ja, dat deed Oetzie ook al, dus dat is niet nieuw.
Oetzie, zou je wat gegevens van de tabellen kunnen laten zien, misschien wordt het dan iets duidelijker.
Er lijkt een dubbeltelling in te zitten door de tweede JOIN. Ik neem aan dat de query met een JOIN wel goed werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE TABLE IF NOT EXISTS `table_modules_forum` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`language_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`url` varchar(100) NOT NULL,
`content` varchar(255) NOT NULL,
`order_count` int(3) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `table_modules_forum_messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`content` text NOT NULL,
`ip_number` varchar(15) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `table_modules_forum_topics` (
`id` int(11) NOT NULL,
`parent_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`url` varchar(100) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
`id` int(11) NOT NULL AUTO_INCREMENT,
`language_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`url` varchar(100) NOT NULL,
`content` varchar(255) NOT NULL,
`order_count` int(3) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `table_modules_forum_messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`content` text NOT NULL,
`ip_number` varchar(15) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `table_modules_forum_topics` (
`id` int(11) NOT NULL,
`parent_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`url` varchar(100) NOT NULL,
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Zoals jij al zei Eric gaat het mis bij de 2de join, als ik die weg haalt word wel het aantal goede topics ui de database gehaald. Het lijkt mij iets met GROUP by te maken alleen ik weet niet wat ik daar anders moet doen, heb al geprobeerd om te grouperen bij 1 en 2 join maar zonder resultaat. Misschien dat ik iets over het hoofd zie of dergelijke want ik snap er even niks van waarom hij niet goede resultaten uit de database haalt.
Wat betreft Noppes, hou je alsjeblieft stil want je lult nog al dom. Stel jij komt met een vraag van 'Ja ik krijg een fout, help me', dan moeten wij dus zeggen, 'ja je hebt een fout, dus oplossen maar'. We zijn hier om elkaar te helpen, wil je dat niet doen verlaat dit forum dan want aan dit soort reacties heeft niemand wat. En nu weer graag ontopic!
En om data vragen heeft ook weinig nut, want die kan je halen uit z'n "resultsets"
En jij ziet mijn antwoorden als waardeloos / nietszeggen, mijn antwoorden zijn erop gericht dat men er over gaat nadenken en zelf tot een oplossing kan komen door zaken op te zoeken / uit te proberen.
De meeste vragen die hier gesteld worden zijn zaken die je in feite behoort te weten alvorens je ook maar begint met wat dan ook. Als het dan niet past moet je er ook niet aan beginnen.
Een ieder die met mysql aan de slag gaat behoort te weten dat de default configuratie LOOSE is. (doorsnee hosters zijn geen database specialisten, laat staan dat deze gekwalificeerde mensen in dienst hebben om op correcte wijze databases te installeren en te configureren)
Dat betekent dus dat:
1. indien mogelijk, je de configuratie na installatie dient aan te passsen
2. indien niet mogelijk, je na de connect mysql moet vertellen hoe het zich moet gedragen
-------------
`status` enum('active','nonactive') NOT NULL,
`first_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_changes` timestamp NOT NULL DEFAULT '0000-00-00 00:00:
zijn zaken die je ook niet alsdanig moet vastleggen bij het creeren van tabellen
timestamps zijn leuk en aardig maar gebrekkig en kunnen al geen default '0000-00-00 00:00: toegewezen krijgen, want 0000-00-00 00:00:00 is geen geldige datum
Je doet er gewoon verstandiger aan om DATE / DATETIME te gebruiken zonder default
enums zijn leuk en aardig, maar hier geld dat het eenvoudig weg niet handig in gebruik is
En dit los je op door apparte tabellen te creeeren met daarin de vertegenwoordigende waarden, dan kan je met
- Foreign Key werken
- zonder een alter nieuwe toevoegingen doen
ENGINE=MyISAM
data integriteit behouden met MyISAM is geen eenvoudige zaak, gebruik InnoDB
Gewijzigd op 06/08/2011 13:32:37 door Noppes Homeland
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
...
(SELECT COUNT(subsub.id) AS count_subsub
FROM table_modules_forum_messages AS subsub
WHERE subsub.parent_id = sub.id
AND subsub.status = 'true'
AND subsub.deleted = 'true') AS count_subsub
...
(SELECT COUNT(subsub.id) AS count_subsub
FROM table_modules_forum_messages AS subsub
WHERE subsub.parent_id = sub.id
AND subsub.status = 'true'
AND subsub.deleted = 'true') AS count_subsub
...
@Noppes: ignore
Gewijzigd op 06/08/2011 13:33:30 door Eric Wagener
@Eric, thanks hij haalt nu de goed gegevens op. Thanks man