find files with 2 or more words

I'm trying to find files that contain two or more specific words (e.g. all files with both "John" and "Mary" in them but not necessarily on the same line) but I don't know how to go about it. Maybe something like grep to find files with the first word, then grep the resulting set of files to find files with the second word, etc. However, I'm not sure how to pass the resulting list of files from the first grep to the next grep. Can someone give me a head start?

grep -l John file more files | xargs grep -l Mary

grep -l prints the names of the files with matches. xargs arranges this list as command line arguments for the second grep; again, we only want grep to print the names of the matching files.

xargs is a general-purpose command for rearranging things so that the results from a pipeline can be passed as command-line arguments to another command.

A roughly equivalent construction would be to use backticks, but xargs has some additional niceties, such as being able to split the commands into multiple processes if the command line grows longer than the kernel can handle.

Here's the same with backticks (at the peril, then, of getting a "Command line too long" error):

grep -l Mary `grep -l John file more files`

Those are grave accents (ASCII 96), not regular apostrophes.