2010-10-21 4 views
7

Ecco la mia domanda originale ...Esiste un modo per utilizzare LIMIT in una sottoquery in MySQL?

SELECT `id` 
    FROM `properties` 
LIMIT 10, 20 

La condizione LIMIT è per l'impaginazione.

Ora, devo ottenere tutto come prima, ma ho bisogno di ottenere solo un terzo delle righe in cui è presente una condizione.

sono arrivato fino a questo, basta gettare LIMIT 30 prima ho capito come fare (le righe totali abbinate/3) * 2.

SELECT `id` 
    FROM `properties` 
WHERE `id` NOT IN (SELECT `id` 
         FROM `properties` 
        WHERE `vendor` = "abc" 
        ORDER BY RAND() 
        LIMIT 30) 
LIMIT 10, 20  

MySQL ha detto ...

1235 - Questa versione di MySQL non supporta ancora 'LIMIT & iN/ALL/ANY/SOME subquery'

Credo che non posso usare LIMIT in una sottoquery.

Quindi questo v'è un multi domanda, ma tutti legati ...

  • è una soluzione per LIMIT in sottoquery?
  • Posso selezionare un 1/3 di righe corrispondenti con MySQL?
  • Devo trasformare questo in 2 query, o semplicemente selezionare tutto e disinserire le righe non richieste in PHP?
+1

Una cosa ovvia che viene in mente è che * risultati casuali * e * * impaginazione in realtà non vanno insieme ... – deceze

+0

@deceze Sì, ho capito che quando lo fai in PHP. Quindi ho appena preso il primo 1/3. – alex

risposta

4

Se la versione di MySQL non supporta che poi si hanno 2 opzioni:

  • aggiornamento. Sempre divertente, ed è generalmente meglio essere sull'ultima versione.
  • Suddividi la sottoquery utilizzando php. Prendi gli id, quindi formatta i risultati in una stringa separata da virgole.
+0

Su un host condiviso, quindi non è possibile eseguire l'aggiornamento. Tuttavia, l'ho fatto in PHP. :) Grazie per la tua risposta. – alex

1

MySQL supporta LIMIT in una sottoquery ... ma MySQL NON supporta l'utilizzo di IN/NOT IN con una sottoquery.

A dire il vero, davvero non so cosa stai cercando di realizzare.

+0

Solo una richiesta strana da parte di un cliente: "Voglio mostrare tutte le proprietà, ma solo un 1/3 casuale di un fornitore specifico". – alex

15

Scusate il ritardo, questo ha funzionato per me:

SELECT p.id 
    FROM properties p 
LEFT JOIN (SELECT t.id 
      FROM PROPERTIES t 
      WHERE t.vendor = 'abc' 
     ORDER BY RAND() 
      LIMIT 30) x ON x.id = p.id 
    WHERE x.id IS NULL 
    LIMIT 10, 20 
+0

Grazie a OMG Ponies, l'ho già fatto in PHP, ma imparerò qualcosa da questo. +1 – alex

+0

Questa è la migliore risposta! Completamente ha funzionato per me –