diff --git a/analysis/app/compare.go b/analysis/app/compare.go
index 9127879..21a89ea 100644
--- a/analysis/app/compare.go
+++ b/analysis/app/compare.go
@@ -167,7 +167,7 @@
 
 func (a *App) compareQuery(q string) *compareData {
 	// Parse query
-	queries := parseQueryString(q)
+	prefix, queries := parseQueryString(q)
 
 	// Send requests
 	// TODO(quentin): Issue requests in parallel?
@@ -175,6 +175,9 @@
 	var found int
 	for _, qPart := range queries {
 		group := &resultGroup{}
+		if prefix != "" {
+			qPart = prefix + " " + qPart
+		}
 		res := a.StorageClient.Query(qPart)
 		for res.Next() {
 			group.add(res.Result())
diff --git a/analysis/app/parse.go b/analysis/app/parse.go
index dab586c..0286a8f 100644
--- a/analysis/app/parse.go
+++ b/analysis/app/parse.go
@@ -8,11 +8,11 @@
 
 // parseQueryString splits a user-entered query into one or more storage server queries.
 // The supported query formats are:
-//     prefix | one vs two  - parsed as {"prefix one", "prefix two"}
-//     prefix one vs two    - parsed as {"prefix one", "two"}
-//     anything else        - parsed as {"anything else"}
+//     prefix | one vs two  - parsed as "prefix", {"one", "two"}
+//     prefix one vs two    - parsed as "", {"prefix one", "two"}
+//     anything else        - parsed as "", {"anything else"}
 // The vs and | separators must not be quoted.
-func parseQueryString(q string) []string {
+func parseQueryString(q string) (string, []string) {
 	var queries []string
 	var parts []string
 	var prefix string
@@ -33,10 +33,10 @@
 		case c == ' ', c == '\t':
 			switch part := q[:r]; {
 			case part == "|" && prefix == "":
-				prefix = strings.Join(parts, " ") + " "
+				prefix = strings.Join(parts, " ")
 				parts = nil
 			case part == "vs":
-				queries = append(queries, prefix+strings.Join(parts, " "))
+				queries = append(queries, strings.Join(parts, " "))
 				parts = nil
 			default:
 				parts = append(parts, part)
@@ -54,7 +54,7 @@
 		parts = append(parts, q)
 	}
 	if len(parts) > 0 {
-		queries = append(queries, prefix+strings.Join(parts, " "))
+		queries = append(queries, strings.Join(parts, " "))
 	}
-	return queries
+	return prefix, queries
 }
diff --git a/analysis/app/parse_test.go b/analysis/app/parse_test.go
index 3a892a8..0a4793a 100644
--- a/analysis/app/parse_test.go
+++ b/analysis/app/parse_test.go
@@ -11,20 +11,24 @@
 
 func TestParseQueryString(t *testing.T) {
 	tests := []struct {
-		q    string
-		want []string
+		q          string
+		wantPrefix string
+		wantParts  []string
 	}{
-		{"prefix | one vs two", []string{"prefix one", "prefix two"}},
-		{"prefix one vs two", []string{"prefix one", "two"}},
-		{"anything else", []string{"anything else"}},
-		{`one vs "two vs three"`, []string{"one", `"two vs three"`}},
-		{"mixed\ttabs \"and\tspaces\"", []string{"mixed tabs \"and\tspaces\""}},
+		{"prefix | one vs two", "prefix", []string{"one", "two"}},
+		{"prefix one vs two", "", []string{"prefix one", "two"}},
+		{"anything else", "", []string{"anything else"}},
+		{`one vs "two vs three"`, "", []string{"one", `"two vs three"`}},
+		{"mixed\ttabs \"and\tspaces\"", "", []string{"mixed tabs \"and\tspaces\""}},
 	}
 	for _, test := range tests {
 		t.Run(test.q, func(t *testing.T) {
-			have := parseQueryString(test.q)
-			if !reflect.DeepEqual(have, test.want) {
-				t.Fatalf("parseQueryString = %#v, want %#v", have, test.want)
+			havePrefix, haveParts := parseQueryString(test.q)
+			if havePrefix != test.wantPrefix {
+				t.Errorf("parseQueryString returned prefix %q, want %q", havePrefix, test.wantPrefix)
+			}
+			if !reflect.DeepEqual(haveParts, test.wantParts) {
+				t.Errorf("parseQueryString returned parts %#v, want %#v", haveParts, test.wantParts)
 			}
 		})
 	}
