# MySQL: SELECT, LIMIT. Abfrage optimieren.



## versuch13 (15. November 2006)

Also, ich habe eine Tabelle in der Hyperlinks nach Kategorien gespeichert werden.

links:

id | cat | link


Jetzt möchte ich von jeder Kategorie die letzten drei Einträge auslesen. Dazu würde ich jetzt drei Abfragen schreiben:


```
SELECT
    `link`
FROM
    `links`
WHERE 
    `cat`    =     'kategorie1'
LIMIT
    0,3
```


```
SELECT
    `link`
FROM
    `links`
WHERE 
    `cat`    =     'kategorie2'
LIMIT
    0,3
```


```
SELECT
    `link`
FROM
    `links`
WHERE 
    `cat`    =     'kategorie3'
LIMIT
    0,3
```


Nun hätte ich eine Abfrage pro Kategorie. Kann ich das irgendwie in eine Abfrage zusammenfassen?


Danke. Gruß


----------



## split (16. November 2006)

```
WHERE `cat` = 'blubb' OR `cat` = 'foo' OR `cat` = 'bar'
```
Außerdem würde ich das Datum mit abspeichern und ein ORDER BY angeben, um sicher zu stellen, dass wirklich die 3 neuesten Einträge ausgelesen werden.


----------



## Gumbo (16. November 2006)

Du kannst die Abfrageergebnisse mit UNION vereinigen.


----------



## versuch13 (16. November 2006)

split hat gesagt.:


> ```
> WHERE `cat` = 'blubb' OR `cat` = 'foo' OR `cat` = 'bar'
> ```
> Außerdem würde ich das Datum mit abspeichern und ein ORDER BY angeben, um sicher zu stellen, dass wirklich die 3 neuesten Einträge ausgelesen werden.



So funktioniert das leider nicht. Aber mit Gumbo´s Link habe ich es dann geschafft, danke. Im SELECT gibt es noch einen JOIN, die Spalte für einen Datums Wert spare ich mir und sortieren nach der ID.

Jetzt ist das eine riesige Abfrage, ist die noch irgendwie zu verbessern?


```
(SELECT 
                `a`.`id`, `a`.`cat`, `a`.`link`, `b`.`hits`   
            FROM     
                `links` AS `a` JOIN `hits` AS `b`       
            ON 
                `a`.`link` = `b`.`link`
            WHERE 
                `a`.`flag` = '1' AND `a`.`cat` = 'Artists'
            ORDER BY
                `a`.`id` DESC
            LIMIT
                0,3)
            UNION
            (SELECT 
                `a`.`id`, `a`.`cat`, `a`.`link`, `b`.`hits`   
            FROM     
                `links` AS `a` JOIN `hits` AS `b`       
            ON 
                `a`.`link` = `b`.`link`
            WHERE 
                `a`.`flag` = '1' AND `a`.`cat` = 'Labels'
            ORDER BY
                `a`.`id` DESC
            LIMIT
                0,3)
            UNION
            (SELECT 
                `a`.`id`, `a`.`cat`, `a`.`link`, `b`.`hits`   
            FROM     
                `links` AS `a` JOIN `hits` AS `b`       
            ON 
                `a`.`link` = `b`.`link`
            WHERE 
                `a`.`flag` = '1' AND `a`.`cat` = 'Mags, etc.'
            ORDER BY
                `a`.`id` DESC
            LIMIT
                0,3)
```


----------

