Question

i need to get a list of users with mosts comments + posts from Drupal + phpBB.

I am using mySQL.

Structure of Drupal database: dr_comments(cid,uid) dr_users(uid,name)

phpBB: phpbb_posts(post_id,poster_id) phpbb_users(user_id,username)

I have SQL code for users with most comments from Drupal and phpBB not together.

Drupal:

SELECT
 U.name,
 COUNT(C.cid) AS CommentCount
FROM
 dr_users AS U
 INNER JOIN dr_comments AS C ON U.uid = C.uid
GROUP BY
 U.name
ORDER BY
 COUNT(C.cid) DESC

LIMIT 10

phpBB:

SELECT
 U.username,
 COUNT(C.post_id) AS CommentCount
FROM
 phpbb_users AS U
 INNER JOIN phpbb_posts AS C ON U.user_id = C.poster_id
GROUP BY
 U.username
ORDER BY
 COUNT(C.post_id) DESC

LIMIT 10

I dont know how to merge it together.

Was it helpful?

Solution

You can use UNION:

SELECT name, SUM(CommentCount) AS TotalCommentCount
FROM (
  SELECT U.name, COUNT(C.cid) AS CommentCount
  FROM dr_users AS U
  INNER JOIN dr_comments AS C ON U.uid = C.uid
  GROUP BY U.name

  UNION ALL

  SELECT U2.username AS name, COUNT(C2.post_id) AS CommentCount
  FROM phpbb_users AS U2
  INNER JOIN phpbb_posts AS C2 ON U2.user_id = C2.poster_id
  GROUP BY U2.username

) temp GROUP BY name

That should do its job. Note for the script above I expect that the usernames are on both programmes equal.

You can also check this SQL Fiddle.

OTHER TIPS

Your ...merge them together... can be interpreted in several ways. If you want to simply union both resultsets keeping order of each resultset intact then you can do

(
  SELECT u.name,
         COUNT(c.cid) CommentCount
    FROM dr_users u JOIN dr_comments c
      ON u.uid = c.uid
   GROUP BY u.name
   ORDER BY COUNT(c.cid) DESC
   LIMIT 10
)
UNION ALL
(
  SELECT u.username,
         COUNT(C.post_id) CommentCount
    FROM phpbb_users u JOIN phpbb_posts c 
      ON u.user_id = c.poster_id
   GROUP BY u.username
   ORDER BY COUNT(c.post_id) DESC
   LIMIT 10
)

If you need to union both resultsets and then reorder them

(
  SELECT u.name,
         COUNT(c.cid) CommentCount
    FROM dr_users u  JOIN dr_comments c
      ON u.uid = c.uid
   GROUP BY u.name
   ORDER BY COUNT(c.cid) DESC
   LIMIT 10
)
UNION ALL
(
  SELECT u.username,
         COUNT(C.post_id) CommentCount
    FROM phpbb_users u JOIN phpbb_posts c 
      ON u.user_id = c.poster_id
   GROUP BY u.username
   ORDER BY COUNT(c.post_id) DESC
   LIMIT 10
)
   ORDER BY CommentCount DESC

It also might be interpreted as get TOP 10 from both phpbb and drupal

SELECT name, COUNT(cid) CommentCount
  FROM
(
  SELECT u.name, c.cid
    FROM dr_users u  JOIN dr_comments c
      ON u.uid = c.uid
   UNION ALL
  SELECT u.username, c.post_id
    FROM phpbb_users u JOIN phpbb_posts c 
      ON u.user_id = c.poster_id
) q
   GROUP BY name
   ORDER BY CommentCount DESC
   LIMIT 10

Here is SQLFiddle demo

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top