Query met LEFT JOIN hulp nodig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joakim Broden

Joakim Broden

04/08/2011 11:27:44
Quote Anchor link
Ik heb de volgende query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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


Alleen nu krijg ik de verkeerde counts want ik krijg:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Categorie
    Naam - omschrijving            4    3
    Naam - omschrijving            0    0
    Naam - omschrijving            0    0

ipv
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Categorie
    Naam - omschrijving            2    3
    Naam - omschrijving            0    0
    Naam - omschrijving            0    0


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
 
PHP hulp

PHP hulp

24/11/2024 11:05:00
 
Joakim Broden

Joakim Broden

05/08/2011 20:22:17
Quote Anchor link
Bumpje :)
 
Noppes Homeland

Noppes Homeland

05/08/2011 21:50:31
Quote Anchor link
De query moet een hele dik fout opleveren!!
 
Joakim Broden

Joakim Broden

05/08/2011 22:03:11
Quote Anchor link
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..
 
Noppes Homeland

Noppes Homeland

06/08/2011 12:14:06
Quote Anchor link
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..

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.
 
Eric Wagener

Eric Wagener

06/08/2011 12:38:49
Quote Anchor link
Dat is bullshit Noppes. Oetzie stelt niet voor niets zijn vraag hier. Hij heeft er zo te zien al naar gekeken en komt er niet uit. Als hij zegt dat er geen foutmelding komt dan geloof ik dat, want ik zie ook even geen syntax fout.
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.
 
Joakim Broden

Joakim Broden

06/08/2011 13:12:14
Quote Anchor link
Zo ziet mijn database structuur er uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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;


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!
 
Noppes Homeland

Noppes Homeland

06/08/2011 13:19:26
Quote Anchor link
@Eric, ook jouw kennis van SQL is onder het nivo van wat het zal moeten zijn.

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
 
Eric Wagener

Eric Wagener

06/08/2011 13:32:35
Quote Anchor link
I.p.v. "COUNT(subsub.id) AS count_subsub" en de tweede join, kun je dit eens in de SELECT proberen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
...


@Noppes: ignore
Gewijzigd op 06/08/2011 13:33:30 door Eric Wagener
 
Joakim Broden

Joakim Broden

06/08/2011 17:38:51
Quote Anchor link
@Eric, thanks hij haalt nu de goed gegevens op. Thanks man
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.