2012-12-26 12 views
48

Mentre si lavora su un sistema che sto creando, ho cercato di utilizzare la seguente query nel mio progetto:MySQL - Operando dovrebbe contenere 1 colonna (s)

SELECT 
topics.id, 
topics.name, 
topics.post_count, 
topics.view_count, 
COUNT(posts.solved_post) AS solved_post, 
(SELECT users.username AS posted_by, 
    users.id AS posted_by_id 
    FROM users 
    WHERE users.id = posts.posted_by) 
FROM topics 
LEFT OUTER JOIN posts ON posts.topic_id = topics.id 
WHERE topics.cat_id = :cat 
GROUP BY topics.id 

": cat" è vincolato dal mio PHP codice mentre sto usando PDO. 2 è un valore valido per ": cat".

Quella domanda mi dà però un errore: "# 1241 - Operando dovrebbe contenere 1 colonna (s)"

Cosa ceppi me è che io penso che questa query avrebbe funzionato senza alcun problema. Selezionare le colonne, quindi selezionarne altre due da un'altra tabella e continuare da lì. Non riesco a capire quale sia il problema.

C'è una soluzione semplice a questo o un altro modo per scrivere la mia query?

risposta

57

tuo sottoquery è selezionare due colonne, mentre lo si utilizza per proiettare una colonna (come parte della clausola di SELECT esterno). È possibile selezionare una sola colonna da tale query in questo contesto.

Prendere in considerazione la possibilità di unirsi alla tabella users; questo ti darà più flessibilità quando selezioni le colonne che vuoi da users.

SELECT 
topics.id, 
topics.name, 
topics.post_count, 
topics.view_count, 
COUNT(posts.solved_post) AS solved_post, 
users.username AS posted_by, 
users.id AS posted_by_id 

FROM topics 

LEFT OUTER JOIN posts ON posts.topic_id = topics.id 
LEFT OUTER JOIN users ON users.id = posts.posted_by 

WHERE topics.cat_id = :cat 
GROUP BY topics.id 
+0

Grazie per la risposta. Risolverò la mia query e ti contrassegnerò come risposta, ma solo per l'input, pensi che ci sia un modo "migliore" per scrivere la mia query rispetto a quello che sto usando ora (ma anche ignorando l'errore in esso contenuto)? –

+0

Ah. Grazie per la modifica sul tuo post originale. Sarò sicuro di segnarti come risposta quando StackOverflow me lo consente. Molte grazie! –

+0

Bene, 'COUNT()' lancia un po 'le cose; la query che ho dato probabilmente darà un errore a causa dell'aggregazione. Potrebbe essere necessario spostare tale aggregazione in una sottoquery, a seconda degli obiettivi della query (che al momento non sono chiari). – cdhowie

5
COUNT(posts.solved_post) AS solved_post, 
(SELECT users.username AS posted_by, 
    users.id AS posted_by_id 
    FROM users 
    WHERE users.id = posts.posted_by) 

Bene, non è possibile ottenere più colonne da una sottoquery del genere. Fortunatamente, la seconda colonna è già posts.posted_by! Quindi:

SELECT 
topics.id, 
topics.name, 
topics.post_count, 
topics.view_count, 
posts.posted_by 
COUNT(posts.solved_post) AS solved_post, 
(SELECT users.username AS posted_by_username 
    FROM users 
    WHERE users.id = posts.posted_by) 
... 
6

Questo errore può verificarsi anche se si utilizza accidentalmente le virgole invece di AND nella clausola di un JOINON:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2) 
                 ^
              should be AND, not a comma 
1

Questo errore può verificarsi anche se si utilizza accidentalmente '=' invece di ' iN' nella clausola WHERE:

pER ESEMPIO:

WHERE product_id = (1,2,3); 
+1

O LIKE invece di IN come ho fatto e non ho potuto trovare il motivo per cui questo errore si verifica. ty per il puntatore. –