I'm late for the party, but I think now biblatex allows you to do that.
Consider the example:
\documentclass{article}
\usepackage{geometry}
\usepackage[citestyle=authoryear-comp]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cites{glashow,herrmann}
\cites{glashow,herrmann,kastenholz}
\cites[1-3]{glashow}{herrmann}[\ppno~4 and~12--14]{kastenholz}
\end{document}
which prints:

If we redefine \multicitedelim we can make it print different delimiters, depending on the number of citations (stored in the citetotal counter) and the number of the current citation (stored in the citecount counter):
\renewcommand*{\multicitedelim}{%
\iflastcitekey
{%
\ifboolexpr{
test {\ifnumgreater{\value{citetotal}+\value{multicitetotal}-1}{2}}
or test {\ifnumgreater{\value{lastcitetotal}+\value{citetotal}}{2}}
}
{\finalandcomma}
{}%
\addspace\bibstring{and}\space
}
{\addcomma\space}%
\ifnumequal{\value{citetotal}}{\value{citecount}}
{\setcounter{lastcitetotal}{\value{citetotal}}}
{}%
}
The above definition checks if the current citation key is the last one in the comma separated list using \iflastcitekey. If it's not the last citation, just print \addcomma\space (i.e., ,␣). Otherwise, if it's the last key, we check if the expression \value{citetotal}+\value{multicitetotal}-1 or \value{lastcitetotal}+\value{citetotal} are greater than two, and if they are, print a \finalandcomma and then \addspace\bibstring{and}\space in all cases (,␣and␣).
The first expression is less or equal the total number of citations in the multi-cite command, so if there are multiple citations it will ensure the \finalandcomma. This expression will only fail in the case \cites{one,two}{three}, where multicitetotal is two and citetotal is 1 when three is being processed. In this case the expression evaluates to 2 and the \finalandcomma is not printed, whereas it should.
To work around that exception I added a bodge temporary counter which stores the previous citetotal. In the case of the exception, lastcitetotal will be 2 and citetotal, 1, and their sum will be larger than 2 so the \finalandcomma will be printed.
Adding that definition to our example:
\documentclass{article}
\usepackage{geometry}
\usepackage[citestyle=authoryear-comp]{biblatex}
\addbibresource{biblatex-examples.bib}
\newcounter{lastcitetotal}
\renewcommand*{\multicitedelim}{%
\iflastcitekey
{%
\ifboolexpr{
test {\ifnumgreater{\value{citetotal}+\value{multicitetotal}-1}{2}}
or test {\ifnumgreater{\value{lastcitetotal}+\value{citetotal}}{2}}
}
{\finalandcomma}
{}%
\addspace\bibstring{and}\space
}
{\addcomma\space}%
\ifnumequal{\value{citetotal}}{\value{citecount}}
{\setcounter{lastcitetotal}{\value{citetotal}}}
{}%
}
\begin{document}
\pagestyle{empty}
\cites{glashow,herrmann}
\cites{glashow,herrmann,kastenholz}
\cites[1-3]{glashow}{herrmann}[\ppno~4 and~12--14]{kastenholz}
\end{document}
we get:

biblatexhas the test\iflastcitekeythat should also take into account multicites. – moewe Apr 04 '19 at 15:48p.~in[p.~1--3]is superfluous (sincebiblatexautomatically adds the "p."/"pp." in postnotes if they contain only a page range) and that in[pp.~4 and~12--14]I would prefer[\ppno~4 and~12--14](here the page detection will yield false because of theand, so we need to ask for the "pp." explicitly). – moewe Apr 04 '19 at 15:51\renewcommand*{\multicitedelim}{% \iflastcitekey {\ifnumgreater{\value{citetotal}+\value{multicitetotal}-1}{2} {\finalandcomma} {}% \addspace\bibstring{and}\space} {\addcomma\space}}works almost except for\cites{glashow,herrmann}{kastenholz}because I couldn't find a way to count the total across several multicites. Hence I used\value{citetotal}+\value{multicitetotal}-1which should be\leqthe actual total. – moewe Apr 04 '19 at 16:09citetotaland use that to check for that exception? Like this? Seems to work, what do you think? Oh, and if I replace[p.~1--3]by[1--3]or[1-3]I getpp. 1–3instead ofp. 1–3. Is that expected? – Phelype Oleinik Apr 04 '19 at 18:001-3is a page range it would be prefixed with "pp." and not "p.". (Other languages might be different, in German we use "S." for both singular and plural.) – moewe Apr 04 '19 at 19:38lastcitetotalidea. I'm pretty much convinced that it should do the right thing here. Of course the additional counter is not pretty, but I'm not sure if it is possible to get a real 'overall citecount' ready... – moewe Apr 04 '19 at 20:05\multicitedelimis inserted we already know how much ismulticitetotal, so it meansbiblatexalready scanned the list of[<postnote>]{<citation>}s once, it just didn't count the citations inside that list. Of course I might be reading something wrong here. When I have some time I'll take a look to see if I manage to do something nicer thanlastcitetotal, meanwhile I'll point that in my answer. Thanks for the help :) – Phelype Oleinik Apr 04 '19 at 21:35biblatex's multicite works roughly as follows: First it collects and counts the multicite groups (that is whatmulticitecountis for), then each multicite group is passed to one normal cite command. A cite command first counts the keys it gets (forcitecount) and then starts its work. .... – moewe Apr 05 '19 at 03:59biblatexrepo :-) – Phelype Oleinik Apr 05 '19 at 18:57\citecommand. (2) The trick to count the entries per multi-cite group does not drop duplicate entries (if they are indeed dropped). An example is at https://gist.github.com/moewew/df9eb6e4f730350084b9a3fb371621a9 – moewe Apr 05 '19 at 19:23overallcitetotal, especially because the counting will be repeated at a later processing step. But that seems to be the only way ... – moewe Apr 05 '19 at 20:22@-autocomplete, so I'll just ping you here. – moewe May 18 '19 at 12:03