1

データベースからさまざまな列を選択していますが、クエリは次のようになります。

SELECT st.* , u.username creator, COUNT(DISTINCT se.sentenceid) AS sentences,
  COALESCE(SUM(v.vote), 0) score, 
  GROUP_CONCAT(se.text ORDER BY se.sentenceid SEPARATOR  ' ') text
FROM stories st
JOIN sentences se ON st.storyid = se.storyid
LEFT OUTER JOIN votes v ON st.storyid = v.storyid
LEFT OUTER JOIN users u ON st.creatorid = u.userid
GROUP BY st.storyid
LIMIT 30

このクエリは、スコア以外のすべてで機能します。出力されるスコアは、文の数に実際のスコアを掛けたものです。私votesのテーブルは次のようになります。

+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| userid  | int(11)    | YES  | MUL | NULL    |       |
| storyid | int(11)    | NO   | MUL | NULL    |       |
| vote    | tinyint(4) | NO   |     | NULL    |       |
+---------+------------+------+-----+---------+-------+

vote1または-1のいずれかの値が含まれます。


実際のスコアを受け取るようにクエリを変更するにはどうすればよいですか?

4

1 に答える 1

3
SELECT st.* , u.username creator, COUNT(DISTINCT se.sentenceid) AS sentences,
  COALESCE((SELECT SUM(v.vote)
            FROM votes v
            WHERE st.storyid = v.storyid), 0) score, 
  GROUP_CONCAT(se.text ORDER BY se.sentenceid SEPARATOR  ' ') text
FROM stories st
JOIN sentences se ON st.storyid = se.storyid
LEFT OUTER JOIN users u ON st.creatorid = u.userid
GROUP BY st.storyid
LIMIT 30

各ストーリーには多くの文と多くの投票が含まれる可能性があるため、可能なすべての結合を乗算することでデカルト積が得られます。

于 2012-10-12T20:28:53.677 に答える