Несколько соединений типа «многие ко многим» в одном запросе mysql без декартовой системы - PullRequest
1 голос
/ 15 июня 2010

В настоящее время я могу получить нужные мне результаты с помощью двух отдельных операторов SELECT

SELECT 
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN refList rl ON bl.biblioID =  rl.biblioID 
GROUP BY bl.biblioID

SELECT
GROUP_CONCAT(
CONCAT_WS( ':', al.lastName, al.firstName )
ORDER BY al.authorID ) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
JOIN authorList al ON al.authorID = ba.authorID 
GROUP BY bl.biblioID

Однако, объединяя их, как это

SELECT
GROUP_CONCAT(
CONCAT_WS( ':', al.lastName, al.firstName )
ORDER BY al.authorID ),
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
JOIN authorList al ON al.authorID = ba.authorID 
LEFT JOIN refList rl ON bl.biblioID =  rl.biblioID
GROUP BY bl.biblioID

приводит к тому, что в столбце результатов автора будут повторяться,Как я могу получить желаемые результаты из одного оператора SELECT без использования DISTINCT?С подзапросами?

1 Ответ

1 голос
/ 16 июня 2010

Если подвыборы приемлемы, я думаю, вы могли бы добиться этого, выполнив что-то вроде этого:

SELECT
  y.authors,
  COUNT(rl.refBiblioID) 
FROM
  (SELECT
    bl.biblioId,
    GROUP_CONCAT(
      CONCAT_WS(':', al.lastName, al.firstName)
      ORDER BY al.authorID) AS authors
  FROM biblioList bl
  LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
  JOIN authorList al ON al.authorID = ba.authorID 
  GROUP BY bl.biblioID) y
LEFT JOIN refList rl ON (y.biblioID =  rl.biblioID)
GROUP BY y.biblioID

Другим решением было бы добавить DISTINCT к вашему GROUP_CONCAT, но это было не то, что вы хотели?

GROUP_CONCAT(
  DISTINCT(CONCAT_WS(':', al.lastName, al.firstName) ORDER BY al.authorID)),
...