Jag har en aktivitetstabell där jag vill hämta vissa aktiviteter som ägt rum, men har lite funderingar över vilka JOINS jag ska använda.
I min aktivitetstabell sparar jag dels händelser för projekt, t.ex. att ett har skapats, raderats eller uppdaterats, men jag lagrar även att någon har loggat in. För projekten så måste users, projects och versions joinas. För inloggningarna måste bara users joinas. Det jag har just nu funkar med hjälp av en UNION, men det känns fel att ställa en så komplicerad fråga för att få fram inloggningarna och slå ihop dem med projekthändelserna. Notera att detta nedan är ett förenklat exempel för att inte överösa er här. Den innehåller egentligen tre gånger så många joins :)
Kan jag på ett enklare sätt ställa bara en SELECT eller i annat fall två sql-frågor, baka ihop dem och sortera på det gemensamma ac_datetime utan att inloggnings-frågan ens tänker på allt det andra?
Stort tack för hjälp!
$fields = "ac_id, ac_p_id, ac_v_id, ac_m_id, ac_n_id, ac_u_id, ac_type, u_name, p_title, v_id, m_name, n_title";
$sql = "SELECT $fields
FROM activity
INNER JOIN users
ON u_id = ac_user_id
INNER JOIN projects
ON p_id = ac_p_id
INNER JOIN versions
ON v_id = ac_v_id
LEFT JOIN media
ON m_id = ac_m_id
LEFT JOIN notes
ON n_id = ac_n_id
WHERE NOT (ac_visibility = 9)
UNION
SELECT $fields
FROM activity
INNER JOIN users
ON u_id = ac_user_id
LEFT JOIN projects
ON p_id = ac_p_id
LEFT JOIN versions
ON v_id = ac_v_id
LEFT JOIN media
ON m_id = ac_m_id
LEFT JOIN notes
ON n_id = ac_n_id
WHERE NOT (ac_visibility = 9) AND ac_type = 'login'
ORDER BY ac_datetime DESC
LIMIT 0,50";
Kanske något i den här stilen om jag förstått det rätt? Kanske inte exakt det du vill åstadkomma men jag tror att det är en join i den stilen du behöver göra. Du behöver antagligen fixa till din SELECT också...
$sql = "SELECT $fields
FROM activity
INNER JOIN users
ON u_id = ac_user_id
[B]INNER JOIN users AS login
ON login.u_id = ac_user_id AND ac_type = 'login'[/B]
INNER JOIN projects
ON p_id = ac_p_id
INNER JOIN versions
ON v_id = ac_v_id
LEFT JOIN media
ON m_id = ac_m_id
LEFT JOIN notes
ON n_id = ac_n_id
WHERE NOT (ac_visibility = 9)
ORDER BY ac_datetime DESC
LIMIT 0,50";
Det jag vill göra är "hämta alla projekthändelser där dessa tre värden måste finnas och två kan vara frivilliga samt hämta alla användare som loggat in och sen visa dem tillsammans i datumordning". Kommer den nya INNER JOIN users AS login göra detta eller kommer den nu att vilja ha en login kopplad till projekthändelserna?
Jag bantar ner det hela lite. Kan man köra en if-fråga om det ska vara INNER JOIN? Typ såhär:
$sql = "SELECT $fields
FROM activity
INNER JOIN users
ON u_id = ac_user_id
if (p_id IS NOT NULL) INNER JOIN projects ON p_id = ac_p_id AND p_visibility NOT (p_visibility = 9)
WHERE NOT (ac_visibility = 9)
ORDER BY ac_datetime DESC
LIMIT 0,50";
Eller kanske till och med skippa LEFT JOIN och bara köra INNER JOIN om p_id inte är NULL. Det jag vill göra är att hämta projektdatan om det är en aktivitet för projekt (p_id är angivet), annars är det en login och projektdata ska inte hämtas.
Om detta är möjligt antar jag att nån typ av if-sats måste till även för mina $fields.
Detta borde vara enkelt, hm.