[MySQL]Query voor bug tracking software

Pagina: 1
Acties:

  • David
  • Registratie: Februari 2001
  • Laatst online: 18-05 21:36
Ik heb voor het ontwikkelen van een applicatie een bugtracker gemaakt. De informatie over de bugs, gebruikers en de reacties van de gebruikers wordt opgeslagen in een MySQL-database. De gebruiker wordt in eerste instantie verwelkomd met een overzicht van alle beschikbare bugs:
Afbeeldingslocatie: http://www.camelon.nl/GoT/sdm-overview.png

De tabel bugs ziet er als volgt uit (alleen relevante velden):
bugid, userid, assignedto

De tabel users bevat:
userid, email

De tabel comments:
bugid, userid, timeposted

Het overzicht moet, naast wat het nu laat zien, ook de tijd van de laatste reply (comment) op die bug laten zien. Een ander punt wat ik wil verbeteren is dat er niet per bug nog een extra query uitgevoerd hoeft te worden om het emailadres van de developer die de bug gaat tackelen (zijn useid staat in assignedto) te achterhalen.

Ik ben zelf een beetje de weg kwijt hoe ik het best deze query kan samenstellen. Momenteel wordt deze query uitgevoerd:
code:
1
SELECT bugs.*, users.userid, users.email FROM bugs, users WHERE bugs.userid = users.userid

En bij elke bug nog
code:
1
SELECT users.email FROM users, bugs WHERE bugs.assignedto = users.userid AND bugs.bugid = ' . $row['bugid']


Hoe kan ik deze samenvoegen tot één query, en het liefst in diezelfde query de tijd van de laatste reply op die bug aanroepen?

Dato DUO synth voor twee


  • disjfa
  • Registratie: April 2001
  • Laatst online: 12-05 15:11

disjfa

be

Met plakband?

Nee ik zou kijken hoe je where stuk inelkaar zit en die goed zetten zodat deze alles eruit haalt.

disjfa - disj·fa (meneer)
disjfa.nl


  • David
  • Registratie: Februari 2001
  • Laatst online: 18-05 21:36
code:
1
WHERE bugs.userid = users.userid AND bugs.assignedto = users.userid

gaat natuurlijk niet werken. Kan iemand me een hint geven over welke kan ik op moet kijken?
code:
1
SELECT MAX(timeposted) FROM comments WHERE bugid = $row['bugid']
gaat natuurlijk ook werken, maar dat moet ik bij elke bug twee queries uitvoeren.

Dato DUO synth voor twee


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 14:37

Pelle

🚴‍♂️

Over de schutting \o/

Verwijderd

Gebruik je een session voor de userid van de gebruiker?

Verwijderd

je zou zoiets kunnen doen,

SELECT bugs.*, users.userid, users.email FROM bugs, users WHERE bugs.userid = users.userid AND bugs.userid = $userid;

  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
niet gecontroleerd en uit het blote hoofd, maar zoiets zou moeten werken:
code:
1
2
3
SELECT bugs.*, users1.userid, users1.email AS Email_Reporter, users2.email AS Email_Assignedto
FROM bugs, users users1, users users2
WHERE bugs.userid = users1.userid AND bugs.assignedto = users2.userid


overigens kun je beter met een left join werken op die users2 tabel, omdat uit jouw screenshot blijkt dat niet iedere bug assigned is aan een gebruiker.

Dus:

code:
1
2
SELECT bugs.*, users1.userid, users1.email AS Email_Reporter, users2.email AS Email_Assignedto
FROM bugs INNER JOIN users users1 ON (users1.userid=bugs.userid) LEFT JOIN users users2 ON (users2.userid=bugs.assignedto)


Heb je meteen niet eens meer een WHERE clause nodig!

[ Voor 45% gewijzigd door mjax op 25-03-2004 16:48 ]


  • David
  • Registratie: Februari 2001
  • Laatst online: 18-05 21:36
Verwijderd schreef op 25 maart 2004 @ 16:39:
je zou zoiets kunnen doen,

SELECT bugs.*, users.userid, users.email FROM bugs, users WHERE bugs.userid = users.userid AND bugs.userid = $userid;
De user moet alle bugs kunnen zien, niet alleen de bugs die 'ie zelf gesubmit heeft.
mjax schreef op 25 maart 2004 @ 16:45:
overigens kun je beter met een left join werken op die users2 tabel, omdat uit jouw screenshot blijkt dat niet iedere bug assigned is aan een gebruiker.
Er is maar één users-tabel, waar ik eigenlijk twee keer een emailadres (met verschillende userids dus) per query uit wil halen.

[ Voor 37% gewijzigd door David op 25-03-2004 20:42 ]

Dato DUO synth voor twee


  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
DiMension schreef op 25 maart 2004 @ 20:40:
[...]


De user moet alle bugs kunnen zien, niet alleen de bugs die 'ie zelf gesubmit heeft.

[...]

Er is maar één users-tabel, waar ik eigenlijk twee keer een emailadres (met verschillende userids dus) per query uit wil halen.
Goed lezen! Ik gebruik die users2 als alias voor de users tabel. Zo kun je 1 tabel dus meerdere keren gebruiken in 1 query. Probeer eerst eens iets uit voordat je er op afgeeft, want de manier die ik je aangeef, werkt gewoon (ik gebruik deze constructie dagelijks). Het kan wel zo zijn dat het syntactisch niet 100% is, maar het gaat om het idee.

Verwijderd

snap dus eigenlijk echt niet wat je wil..... |:(

wil je nou dat alle users alle bugs zien met hun e-mail adressen erbij? en dan de tijd dat ie gepost is? zet je toch ook in de where functie? met Max(datum)?

gaat nu :Z

  • David
  • Registratie: Februari 2001
  • Laatst online: 18-05 21:36
Verwijderd schreef op 25 maart 2004 @ 23:39:
snap dus eigenlijk echt niet wat je wil..... |:(

wil je nou dat alle users alle bugs zien met hun e-mail adressen erbij? en dan de tijd dat ie gepost is? zet je toch ook in de where functie? met Max(datum)?
De bugtabel bevat twee INTs die overeen komen met een userid uit tabel users: 'userid' en 'assignedto'. In de tabel users staan de emailadressen die bij de userids horen.

In één query wil ik dus het emailadres van de user (users.email) in bugs.userid, én het emailadres (wederom dus users.email) van bugs.assignedto.

Gebruik van de MAX()-functie heb ik al geprobeerd, maar in dat geval krijg ik een error dat ik geen GROUP BY-clause heb (die heb ik toch helemaal niet nodig?).

Dato DUO synth voor twee


  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
DiMension schreef op 26 maart 2004 @ 09:25:
[...]


De bugtabel bevat twee INTs die overeen komen met een userid uit tabel users: 'userid' en 'assignedto'. In de tabel users staan de emailadressen die bij de userids horen.

In één query wil ik dus het emailadres van de user (users.email) in bugs.userid, én het emailadres (wederom dus users.email) van bugs.assignedto.

Gebruik van de MAX()-functie heb ik al geprobeerd, maar in dat geval krijg ik een error dat ik geen GROUP BY-clause heb (die heb ik toch helemaal niet nodig?).
Lees jij wel wat anderen posten?!?! Dit is de laatste reactie van mij in deze thread, want hulp wordt blijkbaar niet op prijs gesteld.

De query die ik je gepost hebt werkt gewoon. Ik heb zojuist het ding op mijn database gedraaid (weliswaar met andere tabellen, maar verder hetzelfde) en hij doet precies wat jij wil!

Dit draai ik hier:
code:
1
2
3
SELECT audit.*, users1.userid, users1.email AS Email_Reporter, users2.email AS Email_Assignedto
FROM audit INNER JOIN gebruikers users1 ON (users1.userid=audit.Create_User)
LEFT JOIN gebruikers users2 ON (users2.userid=audit.Edit_User)


Het moet toch niet zo moeilijk zijn om dit geschikt te maken voor jouw database. Kom op.

  • David
  • Registratie: Februari 2001
  • Laatst online: 18-05 21:36
mjax schreef op 26 maart 2004 @ 13:08:
Lees jij wel wat anderen posten?!?! Dit is de laatste reactie van mij in deze thread, want hulp wordt blijkbaar niet op prijs gesteld.
Sorry, mjax. Ik was in eerste instantie niet bekend met het feit dat je aliasen kunt gebruiken voor tabellen. De werking van jouw eerste voorstel was niet duidelijk voor mij. Ik stel je hulp dan ook op prijs, omdat ik het nu wel begrijp en het zo waarschijnlijk wel voor elkaar kan krijgen.

Ik had gisteren en vandaag niet de beschikking over tijd en een dev-pc om jouw voorstellen toe te passen.

Dato DUO synth voor twee

Pagina: 1